gpt4 book ai didi

C#:压缩 XML 给出的结果与在 JavaScript 中执行的结果不同

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:06 28 4
gpt4 key购买 nike

我正在尝试用 C# 压缩 xml 并将其编码为 base64。我尝试同时使用 DeflateStream 和 GZipStream,但似乎得到了与在 Node 库中执行不同的结果。
我将发布 Node 代码和 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.js 对其进行解码。

 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(工作代码 - 供 future 的搜索者使用)

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 :

The base-64 digits in ascending order from zero are the uppercase characters "A" to "Z", the lowercase characters "a" to "z", the numerals "0" to "9", and the symbols "+" and "/". The valueless character, "=", is used for trailing padding.

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

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

所以你想做的事情不会成功。

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

关于C#:压缩 XML 给出的结果与在 JavaScript 中执行的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51037229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com