我们正在使用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的json属性?
答案 0 :(得分:1)
您的数据无法恢复。一般来说,我建议使用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,很可能是因为它是&gt; = 0x80。如果您进一步读入JSON,其中有许多\ufffd
- s,则高于(或等于)0x80的所有值都已替换为此值。因此,即使JSON支持内部的原始二进制数据(但事实并非如此),此刻的数据仍然无法恢复。
答案 1 :(得分:0)
在Java中,您可以使用GZIPInputStream类来解码GZIP数据,我认为您需要先将值转换为ByteArrayInputStream。