zoukankan      html  css  js  c++  java
  • 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;
        }
    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    自签证书的创建与导入
    Linux常用命令
    JS数据类型
    call和apply
    css浮动Float
    vue 列表进入详情后,返回保持原位置
    vue-cli2升级为vue-cli3
    html2canvas使用中的小问题
    jquery点击空白处关闭弹窗
    template.js中template模板中onclick传参
  • 原文地址:https://www.cnblogs.com/whalesea/p/13496372.html
Copyright © 2011-2022 走看看