2017-05-02 9 views
0

SQSメッセージから来たメッセージを処理しようとしています。jsonからgzipバイトを解凍する

私の同僚は、Javaを使用してgzipで圧縮された一つのフィールドを持つJSONオブジェクトを送信しています。基本的にgzip圧縮バイトストリームです。

私はフィールドがどのように見えることSQS上で直接それを見て試してみてください。

"Message" : "\u001F�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000mRmo�P\u0014�/M�h2�N�~1&�43?\u0019�X��R�\u001A(\u0004J�%&���\r��\u0000\u001Bn\u000B\u0010�\u0019\u0006\u0012�8d2�zo/��[.�F퇛��<�9�9缠Ԕeh1}�2��N�\u0014<.9�\u001C�;�pO�G���\u0002�yP��~�\u0013�t�_��姹:�B,-�=\u0004\r\u001A CHの\ u0010 @ - Rz2c8ĈA> O! \t Kx;m = H \ u0006〜 t\ " Ҽp6 、 \ u0012q \ u001F% e% 2 c 、-3w lzv 7 t -Uɰ \u0010 9Q \ u0014 \ u00108] \n \u0005TU \ u0006 \u001E R$ \u0012 8 ԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵԵ i\u0017 RZ't . K o \u0013 | \ u001F \u0013 ] _ :¥u0017¥u00132 b¥u0013 L U19 ¥u0019¥u0017 @ 〜 : (CA \ u0015 \ u0019^RL & {R D \ u0018nN \ u001F \ rYを\ u0019M \ u0010〜 Z; \ u001E @B\u0002��Q�\u0004>�G�mwo�*���\u0002M�MZ�e��M�̪\u0010\u0014S���$�7V1��ߡL�W1�y��W&{��!\u001A\u001C6��\u0003�\u001DX����\u00105�\u0000{\u0002���J�\f� sQのovq \ u0003xP6dUz \ u000BJ \ u0017i \ u0003 \ u0000の\ u0000" の、 `

マイコード:

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 

それの内容を読み取るための任意の方法を?ところで

は、私がhttps://stackoverflow.com/a/12572031/536474を試してみましたが、まだ同じエラーメッセージました。

+1

データをGzipして、その結果をUTF-8のように扱うことは、あなたが簡単に取り除くことではありません。 gzipされたデータは、base64でエンコードする必要があります。さもなければ、あなたの同僚は、これが実際に*解読できるという概念の証明を示す必要があります - つまり、どこかで損失のある変換がないという証明です。全ての可能なバイトがUTF-8のあらゆる可能な位置で有効であるわけではありませんが、base64のbase64アルファベットのすべてのシンボルは有効な1バイトのUTF-8文字です。 –

+1

実際、「 」は、あなたの側、同僚の側、またはSQSのどこに注入されているかによって、巨大な赤旗です。 gzipストリームの最初の2オクテットは常に '0x1f'' 0x8b'です。 '\ u001F'と表示されますが、' 'があります。その理由は、UTF-8の前のオクテット<= '0x7f'のとき、0x8bは実際には無効なオクテットです。これは、これまで法的にも、> = '0x80'である別のオクテットが先行することができます。ルールは少し複雑ですが、それは特に重要ではありません。ポイントは、ブロブを文字として扱うことができないということです。 –

答えて

0

マイケルの-sqlbotは正しかったです。 それは3つの異なるデータ・タイプをサポートしています:AWS SQS資料によれば

  1. ストリング - ストリングは、UTF-8バイナリエンコーディングでのUnicodeです。コード値の一覧については、http://en.wikipedia.org/wiki/ASCII#ASCII_printable_charactersを参照してください。
  2. 数値 - 数値は、正または負の整数または浮動小数点数です。数値には、整数、浮動小数点数、および倍精度が通常サポートする可能性のある値のほとんどを含む十分な範囲と精度があります。数値は38桁までの精度を持つことができ、10^-128〜10^+ 126の間で指定できます。先頭と末尾のゼロはトリミングされます。
  3. バイナリ - バイナリ型の属性は、例えば、圧縮されたデータ、暗号化データ、または画像を任意のバイナリデータを格納することができます。

ユーザは、バイナリタイプを送信するためにBase-64エンコード値を入力する必要があります。

関連する問題