2017-05-02 2 views
0

SQS 메시지에서 오는 메시지로 작업하려고합니다.json의 gzip 바이트 압축 해제

내 동료 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> 오 \ 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 e Ե 4 %? \ u0007 \ u0007 \ \ \ 5 i \ u0017 RZ't . K o \ u0013 | \ u001F \ u0013 ]!! MRd F \ u001C + _ : \ u0017 \ u00132 b \ u0013 L U19 \ u0019 \ u0017 @ ~ : CA (\ u0015 \ u0019 RL &^{R D \ u0018nN \ u001F \ 스피 \ 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에서 이전의 8 진수 <='0x7f' 일 때'0x8b'는 실제로 유효하지 않은 옥텟입니다. 그것은 합법적으로 오직> ='0x80' 인 또 다른 옥텟으로 선행 될 수 있습니다. 규칙은 조금 복잡하지만 특별히 중요하지 않습니다. 요점은 블롭을 아무런 문제없이 문자로 처리 할 수 ​​없다는 것입니다. –

답변

0

마이클의 -sqlbot은 옳았다. AWS SQS 문서에 따르면 는 - 문자열은 UTF-8 인코딩 이진 유니이다

  1. 문자열 : 는 3 가지 데이터 형식을 지원한다. 코드 값 목록은 http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters을 참조하십시오.
  2. 숫자 - 숫자는 양수 또는 음수의 정수 또는 부동 소수점 숫자입니다. 숫자에는 정수, 부동 소수점 및 복식이 일반적으로 지원하는 가능한 대부분의 값을 포함 할 수있는 범위와 정밀도가 있습니다. 숫자는 최대 38 자리의 정밀도를 가질 수 있으며 10^-128 ~ 10^+ 126 사이가 될 수 있습니다. 선행 0과 후행 0은 다듬어집니다.
  3. 바이너리 - 바이너리 형식 특성은 압축 된 데이터, 암호화 된 데이터 또는 이미지와 같은 모든 이진 데이터를 저장할 수 있습니다.

사용자가 이진 형식을 전송할 Base-64 인코딩 값을 입력해야합니다.