2016-05-24 5 views
0

私は以下の問題があります。私はJavaからファイルからバイト配列を作成しています。だから、私は次のようにします:Java - なぜreadAllBytesが不正なバイトコードを返すのですか?

しかし、多くのバイトについて、それは不正確/負の値を返しています。

例えば、私がjavascriptを使ってテストすると、ファイルのすべてのバイトを読み取ることができます。

function readbytes(s){ 
    var f = new File(s); 
    var i,a,c; 
    var d = []; 
    if (f.isopen) { 
     c = f.eof; 
     for(i=0;i<c ;i++){ 
      a = f.readbytes(1); 
      d.push(a); 
     } 
     f.close(); 
     return d; 
    } else { 
     post("could not open file: " + s + "n"); 
    } 
} 

(readbytesは、特定の位置にバイトを与えるプログラムのImの関数です)。

これがそうイムは思っ正しいバイト

を返し、なぜJavaは間違ったコードを返すのですか?これは符号なしの値と関係がありますか?

+0

いいえ、Javaには符号なしの値( 'char'を付けない)がないので、' signed'の値と関係があります。 – Kayaman

答えて

1

Javaは符号なしバイトを認識しません。たとえば、符号なしバイト255は、符号付きバージョン-1として出力されます。ただし、実際の値は同じで、255として表されます。

バイトを符号なし表現に変換する場合は、ビット単位のAND演算子を使用できます。例えば

bytes[x] & 0xff 

Javaは実行時にいずれかのJava仮想マシンのスタックにプッシュすることができる任意のオペランドのバイトを認識していません。実際、整数値に適用するすべての操作は整数になります。そのため、((byte)-1) & 0xff)の結果は整数で、その値は255です。その値をバイトに戻したい場合は、再度byteにキャストしなければなりません。もちろん、-1です。

byte x = -1; // java is friendly enough to insert the implicit cast here 
System.out.println(x); // -1 
System.out.println(x & 0xff); // 255 
byte y = (byte)(x & 0xff); // must add (byte) cast 
System.out.println(y); // -1 

また技術的に見て、出力が異なっているが、内容は、あなたがその署名のない表現に常にJavaの符号付きバイトからマッピングすることができますので、まだ同じであることに注意してください。理想的にはDataInputStreamのようなものを使用し、int readUnsignedByte()を提供します。

+0

こんにちはJoa、私はどのように符号なしバイトに変換するのだろうか?私はJavaScriptの場合と同じint配列で終わることができると期待しています。何とかバイト配列をループし、各値を符号なしの同等値に変更する方法がありますか? –

+0

新しい整数配列を作成し、すべての値を手動でコピーすることができます。 int [] ubytes = new int [bytes.length]; for(int i = 0; i

+0

これはJoaにとって非常に役に立ちました。ありがとうございました。 –

関連する問題