从json解压缩gzip字节

从json解压缩gzip字节,json,amazon-web-services,gzip,python-3.5,amazon-sqs,Json,Amazon Web Services,Gzip,Python 3.5,Amazon Sqs,我正在尝试处理来自SQS消息的消息 我的同事正在发送json对象,该对象有一个字段,该字段使用java用gzip压缩。所以基本上是gzip压缩字节流 当我试图直接在SQS上看到它时,该字段如下所示: “消息”:“\u001F�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000mRmo�P\u0014�/M�氢�N�~1&�43?\u0019�X��R�\u001A(\u0004J�%&���\R��\u0000\u001Bn\u000B\u001

我正在尝试处理来自SQS消息的消息

我的同事正在发送json对象,该对象有一个字段,该字段使用java用gzip压缩。所以基本上是gzip压缩字节流

当我试图直接在SQS上看到它时,该字段如下所示:


“消息”:“\u001F�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000mRmo�P\u0014�/M�氢�N�~1&�43?\u0019�X��R�\u001A(\u0004J�%&���\R��\u0000\u001Bn\u000B\u0010�\u0019\u0006\u0012�8d2�佐/��[.�F퇛�� Micheal-sqlbot是对的。
根据aws sqs文件:
它支持3种不同的数据类型:

  • 字符串–字符串是采用UTF-8二进制编码的Unicode。有关代码值列表,请参阅
  • 数字–数字是正整数或负整数或浮点数。数字具有足够的范围和精度,可以包含整数、浮点数和双精度通常支持的大多数可能值。一个数字最多可以有38位精度,并且可以在10^-128到10^+126之间。前导零和尾随零是微调的医学
  • Binary–二进制类型属性可以存储任何二进制数据,例如,压缩数据、加密数据或图像

  • 它希望用户输入一个Base-64编码的值来发送二进制类型。

    gzip压缩数据,然后将结果当作UTF-8处理,这不是一件容易做到的事情。gzip压缩的数据应该用base64编码。否则,您的同事需要向您展示一个概念证明,这实际上是可以反编译的编码——也就是说,证明某个地方没有有损转换。不是每个可能的字节在UTF-8中的每个可能位置都是有效的,但base64 base64字母表中的每个符号都是有效的单字节UTF-8字符……更好的解决方案。事实上,
    是一个巨大的红旗,这取决于它被注入的位置——你的一方、同事的一方或SQS。gzip流的前两个八位字节总是
    0x1f
    0x8b
    。我们看到
    \u001F
    ,但我们看到了
    \u001F
    0x80
    时,
    0x8b
    确实是一个无效的八位字节。规则有点复杂,但这并不特别相关——关键是不能将blob视为字符而不受惩罚。
    for message in queue.receive_messages(AttributeNames=['All']):
    
        message_dict = json.loads(message.body)
        compressed = message_dict['Message']
        ungziped_str = zlib.decompressobj().decompress(bytes(compressed.encode('utf-8')))
    
    zlib.error: Error -3 while decompressing data: incorrect header check