2011-09-15 3 views
2

私は単純なXOR暗号化を実行したミニアプリを書く必要があった就職面接テストを受けなければなりませんでした。私はFileInputReaderを使って各バイトをプルし、そのキーでXOR演算を実行し、その結果をFileOutputStreamに戻しました。私は何を考えていたのですか?Java FileInputStreamからバイトを読み込むときに-1と0xffを区別する方法はありますか?

FileInputStreamは、32ビットの符号付き型intを返します。 1バイトしか受け取らない場合、それを「バイト」タイプにキャストすることができます。 FileInputStreamは、EOFに達すると-1も返します。しかし、-1 == 0xffは2の補数のバイナリであるため、読み込まれたバイトがEOFではなく0xffであればどうなりますか?

特殊な場合(EOFなど)を除いて数学的に返されるバイト数は0xffですか?または、これはあなたが読んでいるデータに応じて説明しなければならない状況ですか?

答えて

13

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

値をbyteにキャストする前に、-1であることを確認してください。

クラスFileInputStreamread方法のAPIドキュメントは、これを説明する:

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

0xffのバイトが入力に見出されるのであれば、read方法は、値255(0xff)とintを返します。 EOFの場合のみ-1を返します(に格納されている場合は0xffffffff)。あなたは可能性が

+0

+1、あなたはとても速いです! 5秒で私を打つ:( – doNotCheckMyBlog

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 
} 
1

0xffはベース256の-1だけで、ベース2^32で作業しているので混乱はありません。もしあなたが(signed char)-1と書いても(私はそれが有効なJavaではないことを知っています、私と一緒にいてください)、それは0xffとして書かれています。

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

0

ReadメソッドがFileInputStreamクラスに実装されていないため、実際にEOF処理がチェックされる方法を示すos固有の実装が必要です。

関連する問題