时间的法外狂徒

导航

Byte包装类中的ValueOf、parseByte方法无法转化负数二进制字符串

因为valueOf内调用的是parseByte,parseByte中调用的是Integer.ParseInt,而Int在java中是四个字节表示的。

byte的负数-40,二进制是11011001。对于int来说是:00000000 00000000 00000000 11011001,表示216。

Byte的ValueOf方法:

    public static Byte valueOf(String s, int radix)
        throws NumberFormatException {
        return valueOf(parseByte(s, radix));
    }

Byte的parseByte方法:

    public static byte parseByte(String s, int radix)
        throws NumberFormatException {
        int i = Integer.parseInt(s, radix);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
        return (byte)i;
    }

而byte的最大数是127,如果把11011001穿个valueOf,回报NumberFormatException异常。

解决方式:

    /**
     * 其他进制字符串转换成byte类型
     * @param s 需要转换的字符串
     * @param radix 指定字符串的进制
     * @return
     * @throws Exception 
     */
    public byte valueOfByte(String s,int radix) throws Exception {
        int a = Integer.valueOf(s, radix);
        if(a >255) {
            throw new Exception("字符串超出八位");
        }
        //负数计算规则:补码+1,再加负号
        a = -((a^0b11111111) + 1);
        return (byte) a;
    }

 

posted on 2020-08-13 14:48  抄手砚  阅读(773)  评论(0编辑  收藏  举报