问题描述
谷歌两天后绝望。 我正在使用来自rabbitmq 的pika 消息。 我知道它是 base64,而 content_encoding 是 gzip。 我开始将字节正文编码为 utf-8。 现在我仍然需要以某种方式解压缩它。这是到目前为止的代码:
1 def callback(channel,method,properties,body):
2 if properties.content_encoding == 'gzip':
3
4 decoded_body = base64.b64encode(bytes(str(body),'utf-8'))
5 #eliminating the leading 'b
6 decoded_body = decoded_body.decode()
7
8 #this snippet is just copied from another solution
9 buf = io.StringIO(decoded_body)
10 f = gzip.GzipFile(fileobj=buf)
11 decompressed_body = f.read()
12 print(decompressed_body)
以下错误消息出现在第 11 行。
return self._buffer[read:] + \
TypeError: can't concat str to bytes
显然,gzip 文件中有一个“\”,我需要将其转换为 b“\”。 但我不知道如何。 我是在正确的轨道上还是可以更容易地解决?
非常感谢您的帮助!
这是在rabbitmq中打开消息时的有效载荷: AFN3oPUfiwgAAAAAAAQAhU89T8MwEP0ryGJrHJ3t2mo8AqqK+BhIqGC8JKc0UuKUxBmqqv+di4pYGFhOenfv495ZvNA0YUOv2JPw4n77ke4Ix1gSRpGIPY1T OwS+qFQzLtqe8oj9kTcatJJgpDaFWnvrPOg0g40Ca1agPADz30P7NdPjA9OzUpFzTktnMyfXWNYSyVmZmUpXCg2ylhX5MI/V8srTcPgc5tZrnMnWT AFYttALHhqLwYe66RLwRp0xxybkuflrdDfVJ+LO4jafjn3rJDUO24rnDUHf/h/5Kt+MSGCo2FwD+2vZy+QYahuynTgEAAA==
这是我在没有任何编码的情况下打印正文时得到的:
b"\x00Sw\xa0\xf5\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x85O=O\xc30\x10\xfd+\xc8bk\x1c\x9d\xed\xd x02\xaa\x8a\xf8\x18H\xa8\xbc$\xa74R\xe2\x94\xc4\x19\xaa\xaa\xff\x9d\x8b\x8aX\x18XNzw\xef\xe3\xdeY\xbc\xd04aC\xaf\xd8\x93\xf0\xe2~\xfb\x91\xee\x08\xc7X\x12F\x91\x88=\x8dS;\x04\xbe\xa8T3.\xda\x9e\xf2\x88\xfd\x917\x1a\xb4\x92
\xa46\x85Z{\xeb
解决方法
在 gzip 流前面的消息中有五个字节。您需要在 1f 8b
处开始 gzip 解码。
这里有很多不必要的编码和解码。
这行得通吗?
buf = io.BytesIO(body)
f = gzip.GzipFile(fileobj=buf)
decompressed_body = f.read()
print(decompressed_body)