我正在尝试将以下字符串解析为字节。但它给了我 NumberFormat 异常。有人能告诉我解决方案是什么吗?
Byte.parseByte("11111111111111111111111110000001", 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 类型的异常:
- 第一个参数为空或长度为零的字符串。
- 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
- 字符串的任何字符都不是指定基数的数字,除非第一个字符可能是减号“-”(“\u002D”),前提是该字符串的长度大于 1。
- 字符串表示的值不是字节类型的值。
返回: 指定基数中的字符串参数表示的字节值 抛出: NumberFormatException - 如果字符串不包含可解析字节。
Byte.parseByte()
将二进制字符串作为符号大小而不是 2 的补码处理,因此一个字节的最长长度是带符号的 7 位。
换句话说,要表示-127
,您应该使用:
Byte.parseByte("-111111", 2);
以下抛出NumberFormatException
:
Byte.parseByte("10000000", 2);
但是,-127 的二进制文字是:
byte b = (byte) 0b10000000;
相同的行为适用于其他parseXXX()
方法。
来自 javadocs
如果发生以下任何一种情况,则会引发 NumberFormatException 类型的异常:
- 第一个参数为空或长度为零的字符串。
- 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
- 字符串的任何字符都不是指定基数的数字,除非第一个字符可能是减号“-”(“\u002D”),前提是该字符串的长度大于 1。
- 字符串表示的值不是字节类型的值。
您的值是超出范围 -128 到 127 的第二种情况
值太大,无法以字节解析 试试这个:
new BigInteger("011111111111111111111111110000001", 2).longValue();