C#:与在JavaScript中进行压缩相比,对XML进行压缩产生的结果不同 - c#

我试图在C#中压缩xml并将其编码为base64。我尝试同时使用DeflateStream和GZipStream,但似乎得到的结果与在节点库中得到的结果不同。
我将发布节点代码和C#代码:

//zlib = require('zlib');
zlib.deflateRaw(xml, (function(_this) {
      return function(err, deflated) {
             return deflated.toString('base64');
      }
} 

C#DeflateStream

 private static byte[] Deflate(String str)
    {
      using (MemoryStream output = new MemoryStream())
      {
        using (DeflateStream gzip =
          new DeflateStream(output, CompressionMode.Compress))
        {
          using (StreamWriter writer =
            new StreamWriter(gzip, System.Text.Encoding.UTF8))
          {
            writer.Write(str);
          }
        }

        return output.ToArray();
      }
    }

C#GZipStream

public static byte[] Zip(string str)
{
      var bytes = Encoding.UTF8.GetBytes(str);

      using (var msi = new MemoryStream(bytes))
      using (var mso = new MemoryStream())
      {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {
          //msi.CopyTo(gs);
          CopyTo(msi, gs);
        }

        return mso.ToArray();
      }
 }

C#Base64编码:

private static string Base64Encode(byte[] textBytes)
{
   return System.Convert.ToBase64String(textBytes);
} 

我有什么想念的吗?

更新

我找到了一个可行的例子。通过使用它,我还可以使用Node对其进行解码。

 var bytes = Encoding.UTF8.GetBytes(stringToDeflate);
  using (var output = new MemoryStream())
  {
    using (var zip = new DeflateStream(output, CompressionMode.Compress))
    {
      zip.Write(bytes, 0, bytes.Length);
    }
    var base64 = Convert.ToBase64String(output.ToArray());
  }

更新2(工作代码-供将来的搜索者使用)

private static string DeflateAndEncode(string str)
    {
      var bytes = Encoding.UTF8.GetBytes(str);
      using (var output = new MemoryStream())
      {
        using (var zip = new DeflateStream(output, CompressionMode.Compress))
        {
          zip.Write(bytes, 0, bytes.Length);
        }
        var base64 = Convert.ToBase64String(output.ToArray());

        return base64;
      }
    }

    private static string DecodeAndInflate(string str)
    {
      var utf8 = Encoding.UTF8;
      var bytes = Convert.FromBase64String(str);
      using (var output = new MemoryStream())
      {
        using (var input = new MemoryStream(bytes))
        {
          using (var unzip = new DeflateStream(input, CompressionMode.Decompress))
          {
            unzip.CopyTo(output, bytes.Length);
            unzip.Close();
          }
          return utf8.GetString(output.ToArray());
        }
      }
    }

参考方案

C#和Node.js之间用于base-64编码的字符有所不同。

C# uses the following:

  从零开始的底数为64的数字是大写字母“ A”到“ Z”,小写字母“ a”到“ z”,数字“ 0”到“ 9”以及符号“ +”和“ “ /”。无值字符“ =”用于尾随填充。

Node.js使用RFC4648第5节中指定的"The "URL and Filename safe" Base 64 Alphabet":

A-Z, a-z, 0-9, - (minus), _ (underscore)
Trailing padding uses '='

因此,您尝试执行的操作将无效。

您可以通过分别用_-替换+/字符以将C#编码转换为Node.js,反之亦然,然后对base64解码数据,来解决此问题。

Cefsharp如何获取当前的URL地址? C# - c#

我想获取当前地址,基本上将其放在文本框中。我找到了此链接,但似乎什么也听不懂。http://cefsharp.github.io/api/57.0.0/html/P_CefSharp_WinForms_ChromiumWebBrowser_Address.htm我非常感谢某人提供的代码段。这太痛苦了。我正在使用WFA。 参考方案 您必须听下面的地址更改事件并…

C#-如何使用正则表达式替换NULL字符? - c#

我有以下字符串:< \0\"\0E\0x\0t\0e\0n\0s\0i\0b\0i\0l\0i\0t\0y\0,\0v\0e\0r\0s\0i\0o\0n\0=\0\\\0\"\07\0.\00\0.\03\03\00\00\0.\00\0\\\0\"\0,\0p\0u\0b\0l\0i\0c\0K\0e\0y\0T\0o…

C#-文本框的XML子节点 - c#

我在将子节点文本放入c#的富文本框中时遇到麻烦。到目前为止,这是我尝试过的:这是XML文件:<DATA_LIST> <Customer> <Full_Name>TEST</Full_Name> <Total_Price>100</Total_Price> <Discounts>…

C#:基于.NET的网络浏览器不显示图像 - javascript

我是C#语言的新手,我一直在尝试使用基于.NET的Web浏览器来自动化网站,仅在Visual Studio 2015中供个人使用。我已经完成了文档解析,使用了Timer,正确使用了DocumentCompleted事件,以等待网页完全加载,然后解析内容,尝试使异步事件的行为类似于同步事件(以加载通过单击链接进入生成的HTML内容。一个完整的网页),以完成网页…

Winapp(C#)调用Java应用程序->设置进度栏 - c#

我有一个C#winapp,它与Java应用程序通信以通过tcp检索数据。现在,我想添加一个进度条,以等待并显示数据下载繁忙。因为这时winapp冻结,直到它拥有来自Java的所有数据为止。现在我想知道如何编程。因为我认为Java应该不时返回某些东西来在c#中设置进度条。我想我需要使用线程来做,但是我不确定如何去做。如果有人有其他想法或例子,那就太好了。 参考…