我正在开发一个应用程序,其中使用 pako.gzip 压缩大型 JSON 数据,然后使用 btoa 函数将其设为 base64string,以便将数据发布到服务器。在我写的 JavaScript 中:
var data = JSON.stringify(JSONData);
var ZippedData = pako.gzip(data, { to: 'string' });
var base64String = btoa(ZippedData);
/* post to server*/
$http.post("URL?base64StringParam=" + base64String").then(function (response) {
//do stuff
});
问题是我需要在发布后再次用 C# 代码解压缩数据,以便对其进行其他工作。我在 C# 代码中写道:
byte[] data = Convert.FromBase64String(base64StringParam);
string decodedString = System.Text.ASCIIEncoding.ASCII.GetString(data);
Encoding enc = Encoding.Unicode;
MemoryStream stream = new MemoryStream(enc.GetBytes(decodedString));
GZipStream decompress = new GZipStream(stream, CompressionMode.Decompress);
string plainDef = "";
我在这里收到错误
using (var sr = new StreamReader(decompress))
{
plainDef = sr.ReadToEnd();
}
解码时发现无效数据。
任何将数据解压缩回 C# 的帮助将不胜感激
EDIT: 总结一下需要做什么
JavaScript 执行以下操作:
纯文本 >> 到 >> gzip 字节 >> 到 >> base64 字符串
我需要 C# 来做相反的事情:
Base64 >> 到 >> 解压缩字节 >> 到 >> 纯文本
假设有以下js:
dataToCommitString = btoa(pako.gzip(dataToCommitString, { to: "string" }));
这是使用 GZip 压缩/解压缩的正确 C# 代码:取自https://stackoverflow.com/a/7343623/679334
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace YourNamespace
{
public class GZipCompressor : ICompressor
{
private static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public 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();
}
}
public string Unzip(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
//gs.CopyTo(mso);
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
}
}
调用方式如下:
value = _compressor.Unzip(Convert.FromBase64CharArray(value.ToCharArray(), 0, value.Length));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)