2

そのため、単純な XOR 暗号化を実行するミニアプリを作成する必要がある就職の面接のテストを受けなければならず、この質問に出くわしました。FileInputReader を使用して各バイトを取り込み、キーを使用して XOR 演算を実行し、結果を FileOutputStream にプッシュしました。これが私が考えさせられたものです。

FileInputStream は、32 ビットの符号付き型である int を返します。1 バイトしか受信しない場合は、「バイト」型にキャストできます。FileInputStream は、EOF に達した場合も -1 を返します。しかし、2 の補数バイナリでは -1 == 0xff であり、読み取ったバイトが EOF ではなく、実際に 0xff である場合はどうなるでしょうか?

0xff は、特別な場合 (EOF など) を除いて数学的に返されないバイトですか? それとも、これは、読み取っているデータによっては考慮しなければならない状況ですか?

4

4 に答える 4

13

いいえ、 の -1int0xffではなく0xffffffffです。Anintは Java では 32 ビットです。

値を にキャストする前に、値byteが -1 かどうかを確認してください。

readクラスのメソッドの API ドキュメントでは、次のようにFileInputStream説明されています。

この入力ストリームからデータの次のバイトを読み取ります。値 byte は、0 から 255 の範囲の int として返されます。ストリームの終わりに達したために使用可能なバイトがない場合、値 -1 が返されます。このメソッドは、入力データが利用可能になるか、ストリームの終わりが検出されるか、例外がスローされるまでブロックされます。

そのため、値を持つバイトが0xff入力で見つかった場合、メソッドは値 255 ( ) を持つreadを返します。EOF でのみ -1 を返します (これはに格納されている場合です)。int0xff0xffffffffint

于 2011-09-15T14:58:54.213 に答える
2

あなたは出来る:

int value = is.read();
if (value == -1)
   // the end!
else
{
   byte b = (byte) value;
   // use b
}

とにかく、チャンク読み取りを使用する必要があり (バイト配列への読み取りを試みます)、返されたバイト数がゼロの場合は終了です:

int count;
byte[] buffer = new byte[8192];
while ((count = is.read(buffer)) > 0) {
   // use buffer from pos 0 to pos count-1
}
于 2011-09-15T14:59:27.730 に答える
1

0xff は基数 256 では -1 のみです。基数 2^32 で作業しているため、混乱はありません。あなたが書いたとしても(signed char)-1(はい、それは有効なJavaではないことを知っています、ご容赦ください)、それでも0xffとして書き込まれます。

負の戻り値はすべてエラーであり、通常のバイト値はファイルにそのまま書き込まれていると安全に想定できます。

于 2011-09-15T15:00:26.103 に答える
0

ReadメソッドはFileInputStreamクラスに実装されていません。これには、実際にEOF処理がどのようにチェックされるかを示すos固有の実装が必要です。

于 2011-09-15T15:04:25.913 に答える