为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 中带偏移量的 GZip 解压

JavaScript 中带偏移量的 GZip 解压

冉冉说 2023-07-20 16:43:01
我尝试使用的 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);   }}
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

如果你想逐行翻译该函数:


// 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),因为它在单独的线程上运行,以避免导致浏览器冻结。


查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信