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;
        }
    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    Android 权限表
    自己动手写shell命令之write
    libgdx 1.4.1公布
    【JUnit4.10源码分析】5.2 Rule
    TCP协议具体解释(上)
    关于 二维码 与 NFC 之间的出身贫贱说
    Effective C++ Item 42 了解 typename 的双重意义
    C++第12周(春)项目2
    HDU 2256 Problem of Precision(矩阵高速幂)
    【OC语法快览】二、存取方法
  • 原文地址:https://www.cnblogs.com/whalesea/p/13496372.html
Copyright © 2011-2022 走看看