8

コードに小さなエラーがあり、一生理解できません。

たとえば、バイナリデータ(16進数から変換した後)を表す文字列の配列があります。1つのインデックスは1011で、もう1つは11100です。配列を調べて、各インデックスに0を埋め込み、各インデックスが8バイトになるようにします。これらの表現を実際のバイトに変換しようとすると、「11111111」を解析しようとするとエラーが発生します。発生するエラーは次のとおりです。

java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2

スニペットは次のとおりです。

String source = a.get("image block");
int val;
byte imageData[] = new byte[source.length()/2];

try {
    f.createNewFile();
    FileOutputStream output = new FileOutputStream(f);
    for (int i=0; i<source.length(); i+=2) {
        val = Integer.parseInt(source.substring(i, i+2), 16);
        String temp = Integer.toBinaryString(val);
        while (temp.length() != 8) {
            temp = "0" + temp;
        }
    imageData[i/2] = Byte.parseByte(temp, 2);
}
4

3 に答える 3

26

ここでの問題byteは符号付きの型ではないので、有効な値は -128...127 ですか? int(Using )として解析すると、Integer.parseInt()動作するはずです。

ちなみに、数字をゼロで埋める必要もありません。

バイナリ文字列を int に解析したら、それをバイトにキャストできますが、値は引き続き符号付きとして扱われるため、キャスト後に最初にbinary 11111111なり、次になります。int 255byte -1

于 2011-08-09T13:15:51.460 に答える
1

8 1 は 255 であり、java.lang.Byte によると、MAX_VALUE は 2^7 - 1 または正の 127 です。

数値が大きすぎるため、コードは失敗します。最初のビットは、正と負の符号用に予約されています。

parseByteによると

于 2011-08-09T13:19:17.660 に答える
1

byteは -128 から 127 の範囲の数値のみを許可します。int代わりに、-21 億から 21 億の範囲の数値を保持する を使用します。

于 2011-08-09T13:23:16.293 に答える