Sub*_*ged 1 java binary inputstream gzipinputstream
我有一个奇怪的程序,GzipInputStream零填充缓冲区的一部分.我有幸知道流中的字节应该是什么样的,我可以看到缓冲区正在填充8个正确的字节和12个零(不应该为零)
BYTES应该看起来像这样----> 0 20 82 22 -91 27 -96 65 66 65 88 32 32 32 32 81 32 0 0 0 100 78
BYTES实际上看起来像这样---> 0 20 82 22 -91 27 -96 65 66 65 0 0 0 0 0 0 0 0 0 0 0 0
前两个字节表示一个整数,用于确定前两个字节之后的可变长度(以字节为单位)的大小.所以在这个例子中,第一个字节是0 20,而在BIG_ENDIAN中,这给我们后续的有效载荷大小为20个字节.
这是我的阅读代码
gzipInputStream = new GZIPInputStream(url.openStream());
byte[] payload = new byte[2];
gzipInputStream.read(payload);
for(int i=0;i<payload.length;i++){
System.out.println(payload[i]);
}
int payloadSize = ((payload[0] & 0xFF) << 8) | ((payload[1]) & 0xFF);
//read the next payloadSize bytes
byte[] messageBytes = new byte[payloadSize];
gzipInputStream.read(messageBytes);
Run Code Online (Sandbox Code Playgroud)
所以前两个字节是有效载荷数组中的字节,后两个字节是messageBytes中的字节.无法弄清楚
修改代码归功于NPE
byte[] payloadSizeBytes = new byte[2];
int payloadSizeBytesRead = 0;
while(payloadSizeBytesRead < 2){
int r = gzipInputStream.read(buffer);
if(r>0){
payloadSizeBytes[payloadSizeBytesRead] = buffer[0];
payloadSizeBytesRead++;
}
}
int payloadSize = ((payloadSizeBytes[0] & 0xFF) << 8) | ((payloadSizeBytes[1]) & 0xFF);
//read the next payloadSize bytes
byte[] messageBytes = new byte[payloadSize];
int messageBytesRead = 0;
while(messageBytesRead < payloadSize){
int r = gzipInputStream.read(buffer);
if(r>0){
messageBytes[messageBytesRead] = buffer[0];
messageBytesRead++;
}
}
for(int i=0;i<messageBytes.length;i++){
System.out.println(messageBytes[i]);
}
Run Code Online (Sandbox Code Playgroud)
合同read(byte[])是它读取一些数据,并返回已读取的字节数.事实上,你忽略了返回值.相反,您应该检查返回值read()并继续调用,read()直到您读取payloadSize字节为止.
一个简单的方法是read(b, off, len)在循环中使用:
int payloadSize = ((payload[0] & 0xFF) << 8) | ((payload[1]) & 0xFF);
byte[] messageBytes = new byte[payloadSize];
int bytesRead = 0;
while (bytesRead < payloadSize) {
bytesRead += gzipInputStream.read(messageBytes, bytesRead, payloadSize - bytesRead);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |