带偏移量的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);
}
}

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

最新更新