gpt4 book ai didi

java - GZipInputStream .read() 将零插入缓冲区

转载 作者:行者123 更新时间:2023-11-29 08:01:05 25 4
gpt4 key购买 nike

我有一个奇怪的程序,其中缓冲区的 GzipInputStream 零填充部分。我有幸知道字节在流中应该是什么样子,我可以看到缓冲区中填充了 8 个正确的字节和 12 个零(不应为零)

字节应该像这样---->0208222-9127-966566658832323232813200010078

字节实际上看起来像这样--->0208222-9127-96656665000000000000

前两个字节代表一个整数,用于确定前两个字节之后可变长度(以字节为单位)有效负载的大小。因此,在此示例中,第一个字节是 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);

所以前两个字节是有效负载数组中的字节,后 20 个字节是 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]);
}

最佳答案

read(byte[])上的契约(Contract)是它读取一些 数据,并返回已读取的字节数。就目前而言,您忽略了返回值。相反,您应该检查 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);
}

关于java - GZipInputStream .read() 将零插入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com