• 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;
        }
    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    Java知识系统回顾整理01基础02面向对象03方法
    可插件化拓展改造器 slot-maven-plugin
    数据治理框架
    Java读写hdfs上的avro文件
    FTPClient的使用
    Java读写hdfs上的avro文件
    图片上传预览
    css hack 用法注意
    获取get请求后面的参数
    js全局变量污染
  • 原文地址:https://www.cnblogs.com/whalesea/p/13496372.html
Copyright © 2020-2023  润新知