项目中需要用Java代码重写一部分使用C#实现的功能,其中一个函数用到byte数组作为参数,最终需要将byte数据转化为字符串类型,C#中的byte和Java中的byte取值范围不一样,Java中的取值范围为-128~127,C#中取值范围为0~255,所以不能直接进行转换。因为最终要通过二进制值进行转换为字符串,所以需要保证二者的二进制值是一样的。
具体做法是将C#中的byte数组转为二进制存入txt文档,形式如下:
Java读取文档中的二进制数据,再构造byte数组。但是直接调用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的类型转换是通过调用Integer.parseInt进行,MIN_VALUE和MAX_VALUE的值分别为-128和127,当获得的8位二进制值的第一位为1时,byte值应为负数,但用Integer不会转成负数,而是一个大于127的值,从而抛出异常。这应该是jdk的一个bug。只能自己来实现这个方法了:
private static byte convertToJavaByte(String str){
byte result = 0;
if(str.length() < 8){
result = Byte.parseByte(str,2);
}else if(str.length() == 8 && str.startsWith("1")){
byte temp = Byte.parseByte(str.substring(1, str.length()-1),2);
result = (byte) (0 - temp);
}
return result;
}
该方法可以将二进制的字符串转换为合适的byte值。