提问人:TungTung 提问时间:9/7/2023 更新时间:9/12/2023 访问量:119
无法在 Nodejs 中使用 zlib.inflate 解压缩 Gzip 响应和 GBK 编码
Fail to decompress Gzip response and GBK encoding using zlib.inflate in Nodejs
问:
我正在从服务器获取由 Gzip 压缩的数据(十六进制数据),文本编码为 GBK,如下所示:
<Buffer 2d 00 00 00 1f 8b 08 00 00 00 00 00 00 ff 32 34 34 37 32 31 33 32 36 32 30 a8 31 ac 31 e2 02 00 00 00 ff ff 01 00 00 ff ff 96 39 e9 8c 10 00 00 00>
<Buffer d5 19 0f 00 1f 8b 08 00 00 00 00 00 00 ff a4 bd ff 73 1b d7 b5 27 f8 fb fc 15 5d 35 55 5b 49 6d 3d 4d df db df f3 d3 82 a0 28 29 24 25 0d 21 89 13 67 ... 12986 more bytes>
<Buffer ca ee e7 13 20 8a c5 f7 1b 66 68 1f d7 64 13 b3 f7 64 d8 0e 7d a7 fd bb 10 1f 4a 27 53 b9 c9 0b 2c 93 36 3e 94 ef db 9e 88 bc c6 6b 2e 1c ed ea b5 e8 ... 15878 more bytes>
数据格式为 [{4bytes}{内容数据}] 4 字节:这 4 个字节本身不包括的数据包长度。(第一个字节是 Length 的下半字节)
我尝试了,但是正在发生。zlib.inflate
TypeError: Cannot read properties of undefined (reading 'toString')
client.on("data", (data) => {
zlib.inflate(data, (err, data) => {
console.log(data.toString('hex'));
});
如何对上述十六进制响应进行解码和解压缩,并处理TCP数据包碎片?谢谢。
答:
2赞
eli chen
9/7/2023
#1
首先,您可能在这里有错误
client.on("data", (data) => {
zlib.inflate(data, (err, data) => {
//HERE YOU PROBABLY HAVE ERROR. YOU SHOULD CHECK IT
console.log(data.toString('hex'));
});
在数据结构到期时,您还需要跳过前 4 个字节
但无论如何,你应该使用gunzip
这里的工作示例包括数据结构处理
let compressBuffer = Buffer.alloc(0);
let remainSize = 0;
client.on("data", (data) => {
while (data.length) {
if (remainSize == 0) {
remainSize = data.readInt32LE();
data = data.slice(4);
compressBuffer = Buffer.alloc(0);
}
//read as much as you can
const readingPart = data.slice(0, remainSize);
compressBuffer = Buffer.concat([compressBuffer, readingPart]);
data = data.slice(readingPart.length);
remainSize -= readingPart.length;
if (remainSize == 0) {
//we have the full gzip buffer lets decompress it
zlib.gunzip(compressBuffer, (err, decompressedData) => {
if (err) console.log(err);
else {
console.log(decompressedData.toString());
}
});
}
}
});
评论
0赞
TungTung
9/7/2023
谢谢,但我得到了一个,然后是多个Error: unexpected end of file at Zlib.zlibOnError [as onerror] (node:zlib:189:17) {errno: -5, code: 'Z_BUF_ERROR'}
Error: incorrect header check at Zlib.zlibOnError [as onerror] (node:zlib:189:17) {errno: -3, code: 'Z_DATA_ERROR' }
0赞
eli chen
9/7/2023
我从问题的 3 个缓冲区中检查了第一个缓冲区的代码及其工作原理。它的返回是正确的吗?如果是这样,那么也许另一个缓冲区是碎片,你应该在之前将它们组合在一起。它也从你看来是错误的。11724623200|1|2
gunzip
0赞
eli chen
9/7/2023
是的,情况就是这样。我可以从问题中的其他缓冲区确认这一点。前 4 个字节表示的大小与缓冲区的实际大小不匹配。您应该构建正确的缓冲区,将数据转译为gunzip
0赞
TungTung
9/7/2023
对不起,我对构建正确的缓冲区有点困惑,但我知道压缩的数据长度是 274(256+18),我是否需要将数据修剪成每 274 个长度,然后传输到?gunzip
0赞
TungTung
9/7/2023
我需要跳过每个 <Buffer>的前 4 个字节,对吧?这意味着跳过问题中前三个缓冲区的 2D、D5、CA?
评论