【发布时间】:2020-11-10 00:36:10
【问题描述】:
我尝试使用的 API 正在返回 base64 编码响应。响应首先使用具有 4 位偏移量的 GZip 压缩,然后进行 base64 编码。我尝试使用 JavaScript(pako 和 zlib)解析响应,在这两种情况下,它都失败了。 API 有一个 C# 代码示例,说明响应解压缩应如何工作,但我真的不知道如何将其转换为 JavaScript。那么谁能帮我把这个函数转换成 JavaScript 或者只是给我一些关于如何处理 4 字节偏移的提示?我在图书馆的文档中没有找到任何相关内容。
public string Decompress(string value)
{
byte[] gzBuffer = Convert.FromBase64String(value);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return System.Text.Encoding.Unicode.GetString(buffer, 0, buffer.Length);
}
}
【问题讨论】:
-
等等,所以一个 unicode 字符串是 gzip'd(使其更小)然后是 base64'd(使其更大),然后在 http 响应中返回(这可能是 gzip'd 代替)?哎呀(osnews.com/story/19266/wtfsm)。
-
zip.Read 不承诺实际读取长度字节,如果您按照他们的示例,您可以创建一个包含一堆尾随零的字符串。
-
@JeremyLakeman 是的,这就是我对他们减压方法的解释......
标签: javascript c# gzip