JavaScript 中带偏移量的 GZip 解压

我尝试使用的 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);

   }

}


冉冉说
浏览 299回答 1
1回答

一只名叫tom的猫

如果你想逐行翻译该函数:// This is ES6 code; if you want better browser compatibility// use the ES5 variant.import { gunzipSync, strToU8, strFromU8 } from 'fflate';const decompress = str => {  // atob converts Base64 to Latin-1  // strToU8(str, true) converts Latin-1 to binary  const bytes = strToU8(atob(str), true);  // subarray creates a new view on the same memory buffer  // gunzipSync synchronously decompresses  // strFromU8 converts decompressed binary to UTF-8  return strFromU8(gunzipSync(bytes.subarray(4)));}如果您不知道 ES6 是什么:在您的 HTML 文件中:<script src="https://cdn.jsdelivr.net/npm/fflate/umd/index.js"></script>在你的JS中:var decompress = function(str) {  var bytes = fflate.strToU8(atob(str), true);  return fflate.strFromU8(fflate.gunzipSync(bytes.subarray(4)));}我想提一下,如果您要在最后累积成一个字符串,那么流几乎完全没有用处,因此 C# 代码不是最佳的。同时,由于您使用的是标准库,因此它是唯一的选择。此外,如果可能的话,我强烈建议使用回调变体(即gunzip代替gunzipSync),因为它在单独的线程上运行,以避免导致浏览器冻结。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript