我们正在使用packetbeat,一个网络数据包分析工具来捕获http请求和http响应。 Packebeat以json格式保存此数据包事件。当服务器支持gzip压缩时,问题就出现了,packetbeat无法解压缩内容并将gzip内容直接保存为json属性。如你所见(注:json已经简化);
{
{
... ,
"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解压缩压缩的“body”json属性吗?
您的数据无法恢复。一般来说,我建议使用Base64编码来传输打包成JSON的二进制数据,但是如果你喜欢试验,你可以阅读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>
除了String-thing(通常不是一个好主意)之外,这是解压缩gzip压缩字节数组的方法。
但是,有效的gzip数据以幻数0x1F,0x8B开头(参见Wikipedia,或者您也可以挖掘实际规格)。您的数据以0x1F(\u001F
部分)开头,但继续使用\ufffd
Unicode字符,这是替换字符(请再次参阅Wikipedia)。
有些工具编码二进制数据并且不喜欢0x8B,很可能是因为它是> = 0x80。如果你进一步读入你的JSON,其中有许多\ufffd
-s,高于(或等于)0x80的所有值都已被替换为此。因此,即使JSON支持内部的原始二进制数据(但事实并非如此),此刻的数据仍然无法恢复。
在Java中,您可以使用GZIPInputStream类来解码GZIP数据,我认为您需要先将值转换为ByteArrayInputStream。