【问题标题】:NumberFormat Exception to parse String to Byte?NumberFormat 异常将字符串解析为字节?
【发布时间】:2013-02-18 13:07:15
【问题描述】:

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

Byte.parseByte("11111111111111111111111110000001", 2);

【问题讨论】:

  • 那比一个字节大。
  • 一个字节由 8 位组成……每个 0/1 字符都有一点。
  • DV - 在发布问题之前检查 javadocs。
  • 如果您仍然想忽略溢出,您的选择是将 int 解析为 int,然后将 int 转换为 byte。

标签: java byte


【解决方案1】:

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

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

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

以下抛出NumberFormatException

Byte.parseByte("10000000", 2);

但是,-127 的二进制字面量是:

byte b = (byte) 0b10000000;

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

【讨论】:

    【解决方案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 - 如果字符串没有 包含一个可解析的字节。

    【讨论】:

    • 这是不正确的。 parseXXX() 方法将二进制字符串处理为符号大小而不是 2 的补码。看我的回答。
    • @Eng.Fouad:这里的答案是正确的,实际上它只是从 javadoc 复制/粘贴而没有指向它的链接。
    • @jlordo 我知道,这就是为什么我没有否决这个答案。但他们说Parses the string argument as a signed byte 如果基数 = 2,恕我直言,这并不完全正确。
    • @Eng.Fouad:是的,这是真的。 Java 不知道无符号字节,所以他们说它将字符串参数解析为有符号字节。他们没有说第一个数字是符号位。
    【解决方案3】:

    来自 javadocs

    如果有任何一个 NumberFormatException 类型的异常被抛出 出现以下情况:

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

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

    【讨论】:

      【解决方案4】:

      值太大,无法在 byte 中解析 试试这个:

      new BigInteger("011111111111111111111111110000001", 2).longValue();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        相关资源
        最近更新 更多