Python中无法解压LZ4字节数据求助(附Redis操作代码示例)
解决LZ4解压失败的问题
嘿,我仔细看了你的代码和Redis返回的result输出,发现问题根本不是LZ4解压的问题——你拿到的数据压根不是LZ4压缩后的格式!
先搞清楚数据到底是什么
你看result里的b'\xa4date\xa6180320',这里的\xa4是BSON的字符串类型标记(表示后面跟着长度为4的字符串"date"),\xa6对应长度6的"180320",整个数据就是标准的BSON格式(MongoDB常用的二进制序列化格式),完全没有被LZ4压缩过。
修正代码:直接解析BSON就行
你不需要用lz4framed,换用bson库解析就好。先装依赖:
pip install pymongo # pymongo自带bson模块
然后修改你的测试代码:
import redis import bson import unittest class TestWXRedis(unittest.TestCase): def test_t(self): r = redis.StrictRedis(host=xxx, port=xxxx) result = r.hget("xxxxx","xxxx") print(result) # 把BSON二进制转成Python字典 parsed_data = bson.loads(result) print(parsed_data)
万一真的是LZ4压缩的BSON?
如果你的业务逻辑里确实应该是LZ4压缩后的BSON,那可能是用了原始LZ4块压缩(不是lz4framed的帧格式),可以试试用lz4.block模块解压:
import redis import bson import lz4.block import unittest class TestWXRedis(unittest.TestCase): def test_t(self): r = redis.StrictRedis(host=xxx, port=xxxx) result = r.hget("xxxxx","xxxx") print(result) # 先解压再解析BSON decompressed = lz4.block.decompress(result) parsed_data = bson.loads(decompressed) print(parsed_data)
为啥lz4framed会失败?
因为lz4framed只认标准的LZ4帧格式(开头有特定的0x04224D18标识),你的数据开头是b'\xba\x00\x00\x00',完全不符合帧格式要求,自然会报错。
内容的提问来源于stack exchange,提问作者GIvenZeng
相关产品推荐
相关产品推荐

