我尝试与之通信的设备采用偶数奇偶校验的ASCII 7位字符。在尝试转换UTF-8字符时,我将其转换为整数,然后转换为二进制字符串。检查字符串,然后根据需要设置奇偶校验位。
然而,当使用Byte.parseByte将其转换回来时,如果设置了有符号位,则会得到NumberFormatError。我怎么能绕过这个?
public byte addParity(byte b){
int a = (int)b;
int c = 0;
String s = Integer.toBinaryString(a);
for(int i=0; i!=(8-s.length());)
{
s = "0" +s;
}
for(int i=0; i<s.length(); i++){
if(s.substring(i, i+1).equals("1"))c++;
}
if(c%2==0)return b;
else return Byte.parseByte(("1"+s.substring(1)),2);
}
答案 0 :(得分:1)
您收到错误是因为Byte.parseByte
拒绝解析超出字节范围的值(-128..127)。所以它拒绝解析像"10001011"
这样的小数为139的东西。快速修复可以使用Integer.parseInt
代替并将结果转换为byte:
else return (byte) Integer.parseInt(("1"+s.substring(1)),2);
然而,我会退后一步,用逐位算术重做整个事情。
答案 1 :(得分:0)
要设置一位,应该足以执行以下操作:
return (byte) (b | 0x80);