1

バッファの一部をGzipInputStreamゼロで埋める奇妙なプログラムがあります。ストリーム内のバイトがどのように表示されるかを知ることができ、バッファが8つの正しいバイトと12のゼロ(ゼロであってはならない)で満たされていることがわかります。

バイトはこのように見える必要があります---->020 82 22 -91 27 -96 65 66 65 88 32 32 32 32 81 32 0 0 0100 78

BYTESは実際にこのように見えます--->020 82 22 -91 27 -96 65 66 65 0 0 0 0 0 0 0 0 0 0 0 0

最初の2バイトは、最初の2バイトの後の可変長(バイト単位)ペイロードのサイズを決定する整数を表します。したがって、この例では、最初のバイトは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);

したがって、最初の2バイトはペイロード配列のバイトであり、次の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]);
            }
4

1 に答える 1

5

コントラクトは、何らかの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);
}
于 2013-01-17T20:10:12.993 に答える