我正在处理 3 天以来的 zlib 数据,但我无法摆脱这个问题:
zlib原始压缩数据hex如下:
789c34c9410e82301005d0bbfc756b5a832ee62a94900146255620ed80314defae1b772f79050a5af6180df21feb06f2ce6002153c84930ec2dacf8b4a3a38821a7fbefcbed7c4a3805ab401775679f3c76e69b27bb6c259bd1d6cf3bc5d034c0978cd635a7300b993ab1dba5abf000000ffff
我使用 zlib python 库生成的十六进制如下:
789c35c9410e82301005d0bbfc756b5a832ee62a94900146255620ed80314defae1b772f79050a5af6180df21feb06f2ce6002153c84930ec2dacf8b4a3a38821a7fbefcbed7c4a3805ab401775679f3c76e69b27bb6c259bd1d6cf3bc5d034c0978cd635a7300b993ab1dba5abfb1bd28150000ffff
任何人都可以向我解释这两个值之间的区别吗?
import zlib, json
ZLIB_SUFFIX = b'\x00\x00\xff\xff'
data = json.dumps({
"t": None,
"s": None,
"op": 10,
"d": {
"heartbeat_interval": 41250,
"_trace": [
'["gateway-prd-us-east1-b-4kf6",{"micros":0.0}]'
]
}
}, separators=(',', ':')).encode('utf-8')
deflate = zlib.compressobj(6, zlib.DEFLATED, zlib.MAX_WBITS)
result = deflate.compress(data) + deflate.flush() + ZLIB_SUFFIX
print(result)
原始流没有终止,因此无效,并以一个空的存储块结束。您生成的 已终止且有效,但后面跟着一个无关的 00 00 ff ff
。两者都解压缩为相同的数据,但原始数据未使用校验值进行验证。你生成的那个是。你的
ZLIB_SUFFIX
不是这样的东西。它is 是一个零长度和该长度的补码,它将跟随压缩流中存储的块头位。但是,如果它 not 跟随压缩流中存储的块头位,则它没有这样的含义,您生成的就是这种情况。