2016-05-19 1 views
1

これはバグか、私がここで欠けているものがあるかどうかわかりません。ファイルの正確なバイトを取得しようとしています。Java FileInputStreamは、バイト配列の同じインデックスに3-4バイトを入れますか?

だから私はバイト[1024]それの最初の1024バイトを取得するための配列、CHAR [1024]配列を持っている、と私はそれが価値

しかし中だ見るために各バイトにInteger.toBinaryStringをしていますインデックス[20] = 11111111111111111111111111111111 インデックス[21] = 11111111111111111111111111111110

バイトは32ビットになる可能性があります。

は、このケースでは、UTF-16 BOMすると私のテストによると、それはこれだけ各インデックスの最後の8が

が助けを事前にありがとうございますする必要があり、255 254であるべきはずの

答えて

2

バイトとintの両方がJavaで署名されています。

負の値は2の補数として格納されます。

したがって、-1バイトは '1111 1111'と表されます。これは、あなたが見ているものである '1111 1111 1111 1111 1111 1111 1111 1111'として表される-1 intに変換されます。

バイトがbで、正確なビットごとの表示を確認したい場合は、((int) b) & 0xFFを実行する必要があります。

これはあなたのバイトをintに変換し、その新しいintの最初のバイトの "上"のすべてのビットをゼロにリセットします。

+0

説明をありがとう、私のプログラムは今働いています – dac1n

1

Integer.toBinaryString()を呼び出していますが、これはintというパラメータをとります。

あなたが渡したbyteは自動的にintにキャストされます。 intには4バイトがあるため、見ている32ビットが得られます。

+0

残りのバイトはokです。しかし、いずれの場合でも、単にバイトを文字列としてコピーできる別の方法がありますか?私は "00000101"のようなファイルに実際のバイトを印刷したい、それ以外のものにはデコードしないでください – dac1n

+1

[回答](http://stackoverflow.com/a/12310078/3558960)は解決策を提示します。 –

+0

&0xFFはうまくいくようです。しかし、私がprintln(byte [i])だけを実行し、コンソールに整数が表示されても、それは私のミスのような符号付き整数だと仮定していますか?私はちょうどバイト&0xFFがファイルの内容であることを確かめたいです – dac1n

関連する問題