问题背景
由于平时与单片机通信比较多,众所周知,单片机是C语言写的,C语言既有无符号数据类型,也有有符号数据类型,而java只有有符号数据类型。由于工作需要,测试人员用单片机传给android 设备传输 unsigned long类型的最大数据,由于C语言unsigned long 是无符号类型的数据,即最大数据是2的64次方减1,但是在java中使用 Long.parseLong(result);去解析就会报异常,原因是java中long是有符号数据类型,没有无符号数据类型,看似有相同的数据类型,其实存储空间确是不同的,java中的long类型表示的最大值是2的63次方减1,所以这里就涉及到java的大数处理。
解决方案
BigInteger的构造函数支持各种进制的转换
BigInteger finalData;
//韦根50 韦根66获取到的是16进制的字符串,需要先转换成16进制数据
//再转换成10进制数据抛给上层
if (readData[0] == 2 || readData[0] == 3) {
finalData = new BigInteger(result, 16);
} else if (readData[0] == 0 || readData[0] == 1) {
finalData = new BigInteger(result, 10);
} else {
finalData = new BigInteger(result, 16);
}
data.put("wgData", finalData.toString());
BigInteger,BigDecimal并不是一种数据类型,这些大数都会以字符串的形式存入在内存中。以下是BigInteger的api,简单了解下。
也支持不同进制的打印输出,
/**
* Returns a string containing a string representation of this {@code
* BigInteger} with base radix. If {@code radix < Character.MIN_RADIX} or
* {@code radix > Character.MAX_RADIX} then a decimal representation is
* returned. The characters of the string representation are generated with
* method {@code Character.forDigit}.
*
* @param radix base to be used for the string representation.
*/
@NonNull public String toString(int radix) {
if (radix == 10) {
return getBigInt().decString();
} else {
prepareJavaRepresentation();
return Conversion.bigInteger2String(this, radix);
}
}
参考文献
1.https://blog.youkuaiyun.com/zhongkelee/article/details/52289163
2.https://www.jianshu.com/p/8b89ab19db84