使用 pika

问题描述

谷歌两天后绝望。 我正在使用来自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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...