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; }
就算这个世道烂成一堆粪坑,那也不是你吃屎的理由