2017-12-18 21 views
0

http要求とhttp応答をキャプチャするネットワークパケットアナライザツールであるpacketbeatを使用しています。 Packebeatはこのパケットイベントをjson形式で保持します。この問題は、サーバーがgzip圧縮をサポートし、packetbeatがコンテンツを解凍してjson属性としてgzipコンテンツに直接保存できなかった場合に発生します。ご覧のとおり(注: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ファイルでコンテンツを解凍することを検討しています。誰かが私が圧縮した "body" json属性をjavaを使って解凍する必要があると教えてもらえますか?

答えて

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部分)で始まりますが、置換文字(Wikipediaを再度参照してください)の\ufffd Unicode文字で続きます。
一部のツールはバイナリデータをエンコードしていましたが、0x8Bが嫌いでした。おそらく> 0x80だったからです。さらにJSONを読み込んだ場合は、\ufffd -sが多くあり、0x80以上の値はすべてこれに置き換えられています。したがって、JSONが生のバイナリデータを内部でサポートしていても、現時点ではデータは回復不能に破損しています(ただし、そうではありません)。

0

Javaでは、GZIPInputStreamクラスを使用してGZIPデータをデコードすることができます。まず、値をByteArrayInputStreamに変換する必要があると思います。

+0

gzipinputstreamクラスを使用してgzipデータを解凍しようとしていますが、前述のように、以前は文字列形式の本文属性の内容をバイト配列形式に変換して変換できませんでした。何か案が? –