摘要:
现在的设备设计数据为有符号(就是有正...
现在的设备设计数据为有符号(就是有正负号之分)的数据比如温度时,对于负数的十六进制表示一般都采用二进制补位表示,针对这种表示负数的方法,本博主分享用java来解析设备数据当中为负数的demo代码
拿温度举例,温度有零上和零下之分,上代码
// 温度处理
String tempStr = dataArr[51] + dataArr[52] + dataArr[53] + dataArr[54];
byte[] binaryArray = hexStringToBinaryArray(tempStr);
StringBuilder binaryString = new StringBuilder();
// 输出转换后的2进制数组
for (byte b : binaryArray) {
binaryString.append(b);
}
char firstBinaryString = binaryString.charAt(0);
if(firstBinaryString == '1'){
// 如果二进制第一位为1表示该温度为负数,则换算成负数温度步骤如下:
// 将除第一个元素之外的每个元素取反
binaryString.deleteCharAt(0);
binaryString = invertBinary(binaryString.toString());
// 将其二进制的的第一位替换为“0”
binaryString.insert(0, '0');
// 将二进制加1
Integer tempInt = Integer.parseInt(binaryString.toString(), 2);
tempInt ++;
String temperatureStr = Double.toString(new Double((double)tempInt) / 10.0);
BigDecimal temperature = new BigDecimal('-' + temperatureStr).setScale(2, RoundingMode.DOWN); // 始终使BigDecimal保留两位小数
insertData.setTemperature(temperature);
}else{
String temperatureStr = Double.toString(new Double((double)Integer.parseInt(tempStr, 16)) / 10.0);
BigDecimal temperature = new BigDecimal(temperatureStr).setScale(2, RoundingMode.DOWN); // 始终使BigDecimal保留两位小数
insertData.setTemperature(temperature);
}
/**
* 将二进制字符串每位元素取反
* @param binaryString 字符串
* @return 字符串
*/
private StringBuilder invertBinary(String binaryString) {
StringBuilder sb = new StringBuilder();
for (char c : binaryString.toCharArray()) {
sb.append(c == '0' ? '1' : '0');
}
return sb;
}
/**
* 将16进制字符串转化成二进制字节数组
* @param hexString 字符串
* @return 数组
*/
private byte[] hexStringToBinaryArray(String hexString) {
int len = hexString.length();
byte[] binaryArray = new byte[len * 4];
for (int i = 0; i < len; i++) {
char c = hexString.charAt(i);
int value = Character.digit(c, 16);
for (int j = 0; j < 4; j++) {
binaryArray[i * 4 + (3 - j)] = (byte) ((value >> j) & 0x01);
}
}
return binaryArray;
}