8

我的代码中有一个小错误,我一生都无法弄清楚。

我有一个字符串数组,它们表示二进制数据(从十六进制转换后),例如:一个索引是 1011,另一个是 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 11111111int 255首先变为,然后byte -1在强制转换之后。

于 2011-08-09T13:15:51.460 回答
1

嗯,8 个是 255,根据 java.lang.Byte,MAX_VALUE 是 2^7 - 1 或正 127。

所以你的代码会因为你的数字太大而失败。第一位是为正号和负号保留的。

根据parseByte

于 2011-08-09T13:19:17.660 回答
1

byte' 只允许 -128 到 127 范围内的数字。我会改用 an int,它包含 -21 亿到 21 亿范围内的数字。

于 2011-08-09T13:23:16.293 回答