1.项目背景:通过WebSocket连接,设备传递UDP数据,对UDP数据进行解析,按bit位协议来做前端展示。(类似 AA BB CC DD 01 75 92 89 76 88 .. .. .. .. .. ..)
2.仅讲16进制转10进制变正负数的过程。
3.原理,将获取当前数据包位置的数据如 AA BB 整体转换成二进制数据,在判断最高位bit15的位置是否为0,0则为正数,1则为负数,我也不知道为什么,领导给我们讲的... 画图如下↓ ↓ ↓ ↓ ↓ ↓
细节:(具体我也不知道为什么这样规定,就当是个公式)
1)从1010 1010 1011 1011由右向左数,依次为bit0,bit1,bit2,...,bit15。规定是判断bit15为0则数据为负数,为1正常转十进制计算。
2)为负数时,有两个选择,可以整体转换十进制后前面加"-"号,也可以直接减去(FFFF = 65535)方便计算,
3)代码展示
Long status;
String value = "BBFF";
//截取最高位
String bitHigh = value.substring(0, 1);
//16进制转10进制
int radix = Integer.parseInt(bitHigh, 16);
//10进制转2进制
String binaryString = Integer.toBinaryString(radix);
//二进制不够补位
if(binaryString.length() != 4){
for (int i = binaryString.length(); i<4; i++){
binaryString = "0" + binaryString;
}
}
//bit15 1负数 0正数 (负数直接小数减大数可以实现)
if (binaryString.substring(0,1).equals("1")){
Long l = Long.valueOf(value, 16);
status = l - 65535;
}else {
status = Long.valueOf(value, 16);
}