0

我正在尝试将以下字符串解析为字节。但它给了我 NumberFormat 异常。有人能告诉我解决方案是什么吗?

Byte.parseByte("11111111111111111111111110000001", 2);
4

4 回答 4

2

超出字节范围,即 -128 到 127。来自parseByte(String s,int radix) javadoc:

public static byte parseByte(String s, int radix)throws NumberFormatException

将字符串参数解析为第二个参数指定的基数中的有符号字节。字符串中的字符必须都是指定基数的数字(由 Character.digit(char, int) 是否返回非负值决定),但第一个字符可能是 ASCII 减号 '-' ('\u002D ') 表示负值。返回结果字节值。如果发生以下任何一种情况,则会引发 NumberFormatException 类型的异常:

  1. 第一个参数为空或长度为零的字符串。
  2. 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
  3. 字符串的任何字符都不是指定基数的数字,除非第一个字符可能是减号“-”(“\u002D”),前提是该字符串的长度大于 1。
  4. 字符串表示的值不是字节类型的值。

返回: 指定基数中的字符串参数表示的字节值 抛出: NumberFormatException - 如果字符串不包含可解析字节。

于 2013-02-18T13:09:32.700 回答
2

Byte.parseByte()将二进制字符串作为符号大小而不是 2 的补码处理,因此一个字节的最长长度是带符号的 7 位。

换句话说,要表示-127,您应该使用:

Byte.parseByte("-111111", 2);

以下抛出NumberFormatException

Byte.parseByte("10000000", 2);

但是,-127 的二进制文字是:

byte b = (byte) 0b10000000;

相同的行为适用于其他parseXXX()方法。

于 2013-02-18T13:12:02.607 回答
1

来自 javadocs

如果发生以下任何一种情况,则会引发 NumberFormatException 类型的异常:

  • 第一个参数为空或长度为零的字符串。
  • 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
  • 字符串的任何字符都不是指定基数的数字,除非第一个字符可能是减号“-”(“\u002D”),前提是该字符串的长度大于 1。
  • 字符串表示的值不是字节类型的值。

您的值是超出范围 -128 到 127 的第二种情况

于 2013-02-18T13:10:52.257 回答
0

值太大,无法以字节解析 试试这个:

new BigInteger("011111111111111111111111110000001", 2).longValue();
于 2013-02-18T13:12:30.473 回答