微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带偏移量的JavaScript中的GZip解压缩

如何解决带偏移量的JavaScript中的GZip解压缩

我尝试使用的API返回base64编码的响应。首先使用具有4位偏移量的GZip压缩响应,然后对base64进行编码。我尝试使用JavaScript(pakozlib)解析响应,但在两种情况下均失败。该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,buffer.Length);
    }
    return System.Text.Encoding.Unicode.GetString(buffer,buffer.Length);
   }
}

解决方法

我将使用fflate(免责声明,我是作者)来执行此操作。如果要将该功能行转换为行:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。