当前问题主要是Android和下位机交互的时候用到,像一些环境传感器,陀螺仪之类的
1.从传感器获取HEX返回值,取出其中的有用值。我们当前使用"BDD4"这个值来写demo
2.检查高位是否为1,这个是和0x80进行或处理。"BDD4"高位即“BD”,如下
int ten = Integer.parseInt("BDD4".substring(0,2), 16);
Log.e("tiwolf", "二进制:" + ten);
byte value = (byte) ten;//解决二进制补码(两个十六进制,这里即-128-127)
if ((value & 0x80)==0x80){
?????如果高位为1,则在这里处理HEX补码问题
}else{
?????如果高位不为1,则直接得到数值
}
3.高位为1,处理补码问题
byte[] bytes = hexStr2Byte("BDD4");
// 2进制取反
String str2 = "";
byte temp;
for (int i = 0; i < bytes.length; i++) {
temp = bytes[i];
bytes[i] = (byte) (~temp);
str2 += Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1);
}
Log.e("tiwolf", "取反后二进制:" + str2);
// 取反后+1
String add_1 = Solution(str2, "1");
Log.e("tiwolf", "取反后二进制+1:" + add_1);
// 将取反+1后的二进制字符串转10进制
int d = Integer.parseInt(add_1, 2);
Log.e("tiwolf", "二进制字符串转10进制:" + -d);
/**
* 16进制String转2进制bite
*
* @param hex
* @return
*/
public static byte[] hexStr2Byte(String hex) {
ByteBuffer bf = ByteBuffer.allocate(hex.length() / 2);
for (int i = 0; i < hex.length(); i++) {
String hexStr = hex.charAt(i) + "";
i++;
hexStr += hex.charAt(i);
byte b = (byte) Integer.parseInt(hexStr, 16);
bf.put(b);
}
return bf.array();
}
/**
* 两个二进制字符串求和
*
* @param a
* @param b
* @return
*/
public static String Solution(String a, String b) {
StringBuilder ans = new StringBuilder();
int ca = 0;
for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = ca;
sum += i >= 0 ? a.charAt(i) - '0' : 0;
sum += j >= 0 ? b.charAt(j) - '0' : 0;
ans.append(sum % 2);
ca = sum / 2;
}
ans.append(ca == 1 ? ca : "");
return ans.reverse().toString();
}
全部完整处理补码 代码如下:
package com.example.calutil;
import android.util.Log;
import java.nio.ByteBuffer;
/**
* @author tiwolf_li
* @Date on 2021/9/23
* @Description
*/
class CalUtil {
public void setCal(String hexStr){
// String sixteen = "7D";
//先判断高位是否为1,如果是则进行补码操作,如果不是则直接转成10进制
int ten = Integer.parseInt(hexStr.substring(0,2), 16);
Log.e("tiwolf", "二进制:" + ten);
byte value = (byte) ten;//解决二进制补码(两个十六进制,这里即-128-127)
Log.e("tiwolf", "二进制1:" + value);
// String ss = String.valueOf(value);
// int wd = Integer.parseInt(ss);
// Log.e("tiwolf", "二进制数值:" + wd);
if ((value & 0x80)==0x80){
//这个处理高位为1以后的逻辑
Log.e("tiwolf", "setCal这个需要补码: "+hexStr.substring(0,2)+";"+value);
byte[] bytes = hexStr2Byte(hexStr);
// 2进制取反
String str2 = "";
byte temp;
for (int i = 0; i < bytes.length; i++) {
temp = bytes[i];
bytes[i] = (byte) (~temp);
str2 += Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1);
}
Log.e("tiwolf", "取反后二进制:" + str2);
// 取反后+1
String add_1 = Solution(str2, "1");
Log.e("tiwolf", "取反后二进制+1:" + add_1);
// 将取反+1后的二进制字符串转10进制
int d = Integer.parseInt(add_1, 2);
Log.e("tiwolf", "二进制字符串转10进制:" + -d);
}else {
int data = Integer.parseInt(hexStr, 16);
Log.e("tiwolf", "setCal: 直接得到数值="+data);
}
}
/**
* 16进制String转2进制bite
*
* @param hex
* @return
*/
public static byte[] hexStr2Byte(String hex) {
ByteBuffer bf = ByteBuffer.allocate(hex.length() / 2);
for (int i = 0; i < hex.length(); i++) {
String hexStr = hex.charAt(i) + "";
i++;
hexStr += hex.charAt(i);
byte b = (byte) Integer.parseInt(hexStr, 16);
bf.put(b);
}
return bf.array();
}
/**
* 两个二进制字符串求和
*
* @param a
* @param b
* @return
*/
public static String Solution(String a, String b) {
StringBuilder ans = new StringBuilder();
int ca = 0;
for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = ca;
sum += i >= 0 ? a.charAt(i) - '0' : 0;
sum += j >= 0 ? b.charAt(j) - '0' : 0;
ans.append(sum % 2);
ca = sum / 2;
}
ans.append(ca == 1 ? ca : "");
return ans.reverse().toString();
}
}
借鉴参考了:
16进制转10进制,以及二进制负数的补码_meixi_android的博客-CSDN博客
Java中HEX负数补码问题 将高位为1的16进制数据转二进制 取反 加一取得负数问题_挨T工作室的博客-CSDN博客
|