2017-12-18 31 views
0

우리는 http 요청 및 http 응답을 캡처하는 네트워크 패킷 분석기 도구 인 packetbeat를 사용하고 있습니다. Packebeat는이 패킷 이벤트를 json 형식으로 유지합니다. 문제는 서버가 gzip 압축을 지원할 때 발생하며 packetbeat는 내용을 압축 해제하지 않고 gzip 내용을 json 속성으로 직접 저장할 수 없습니다. 보시다시피 (참고 : json은 단순화되었습니다.);Java는 json 속성의 HTTP GZIP 컨텐트를 압축 해제합니다.

{ 
{ 
    ... , 
    "content-type":"application/json;charset=UTF-8", 
    "transfer-encoding":"chunked", 
    "content-length":6347, 
    "x-application-context":"proxy-service:pre,native:8080", 
    "content-encoding":"gzip", 
    "connection":"keep-alive", 
    "date":"Mon, 18 Dec 2017 07:18:23 GMT" 
}, 
"body": "\u001f\ufffd\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0003\ufffd]k\ufffd\u0014DZ\ufffd/\ufffdYI\ufffd#\ufffd*\ufffdo\ufffd\ufffd\ufffd\u0002\t\u0010^\ufffd\u001c\u000eE=\ufffd{\ufffdb\ufffd\ufffdE\ufffd\ufffdC\ufffd\ufffdf\ufffd,\ufffd\u003e\ufffd\ufffd\ufffd\u001ef\u001a\u0008\u0005\ufffd\ufffdg\ufffd\ufffd\ufffdYYU\ufffd\ufffd;\ufffdoN\ufffd\ufffd\ufffdg\ufffd\u0011UdK\ufffd\u0015\u0015\ufffdo\u000eH\ufffd\u000c\u0015Iq\ndC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd ... " 
} 

우리는 전처리 패킷 json 파일을 압축 해제하려고 생각하고 있습니다. 누군가 내가 java를 사용하여 zipped "body"json 속성을 압축 해제 할 필요가 있다고 말할 수 있습니까?

답변

1

데이터가 복구 불가능하게 손상되었습니다. 일반적으로 JSON에 압축 된 바이너리 데이터를 전송하기 위해 Base64 인코딩을 사용하는 것이 좋지만 실험을 원하면 Binary Data in JSON String. Something better than Base64에서 가능한 대안을 읽을 수 있습니다.

그렇지 않으면, 이론적으로 당신은 단지 바이트의 배열을 얻을 수 String.getBytes()의 변형을 사용할 수 있고, (다른 대답에) 언급에 결과를 감싸 스트림 :

byte bodyBytes[]=body.getBytes(); 
ByteArrayInputStream bais=new ByteArrayInputStream(bodyBytes); 
GZipInputStream gis=new GZipInputStream(bais); 
<do something with gis here, perhaps use an additional DataInputStream> 

을 별도로 현악기에서 (보통 좋은 생각은 아닙니다.) 이것은 gzip으로 압축 된 바이트 배열을 풀는 방법입니다.
유효한 gzip 데이터는 마법 번호 0x1F, 0x8B로 시작합니다 (Wikipedia 참조 또는 실제 사양을 확인할 수도 있음). 데이터는 0x1F (\u001F 부분)로 시작하지만 대체 문자 인 \ufffd 유니 코드 문자로 계속됩니다 (Wikipedia 참조).
일부 도구는 이진 데이터를 인코딩했으며 0x8B를 좋아하지 않았습니다. 아마도 0x80 이상 이었기 때문일 것입니다. JSON을 추가로 읽으면 \ufffd -s가 많으며 위의 모든 값 (또는 같음)이 0x80으로 바뀌 었습니다. 따라서 JSON이 원시 이진 데이터를 내부에서 지원할지라도 현재 데이터는 복구 할 수 없게 파괴됩니다 (그러나 그렇게하지는 않습니다).

0

자바에서는 GZIPInputStream 클래스를 사용하여 GZIP 데이터를 디코딩 할 수 있습니다. 먼저 값을 ByteArrayInputStream으로 변환해야합니다.

+0

gzipinputstream 클래스를 사용하여 gzip 데이터의 압축을 풀려고했지만 이전에 말한 것처럼 문자열 형식의 본문 속성 내용을 바이트 배열 형식으로 변환해야하며 변환 할 수 없습니다. 어떤 생각? –