本文作者:DurkBlue

JAVA当设备数据为有符号数据的十六进制数据时该如何解析负数数据推荐

DurkBlue 前天 33
JAVA当设备数据为有符号数据的十六进制数据时该如何解析负数数据摘要:             现在的设备设计数据为有符号(就是有正...

            现在的设备设计数据为有符号(就是有正负号之分)的数据比如温度时,对于负数的十六进制表示一般都采用二进制补位表示,针对这种表示负数的方法,本博主分享用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;
}

JAVA当设备数据为有符号数据的十六进制数据时该如何解析负数数据  第1张



此篇文章由DurkBlue发布,转载请注明来处
文章投稿或转载声明

来源:DurkBlue版权归原作者所有,转载请保留出处。本站文章发布于 前天
温馨提示:文章内容系作者个人观点,不代表DurkBlue博客对其观点赞同或支持。

赞(0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享