最近写通信相关的代码,获取了16进制的返回信息,但是数据类型是String,需要转化为10进制的数值类型才能使用,所以来总结一下:
首先我的字符串前6个字节是通信地址,最后4个字节是CRC校验码,所以先把有效数据截取出来:
/**
* 截取字符串有效值
*/
public static String hexToInt(String data){
String str = data.substring(6,data.length()-4);
for (int i = 0; i < str.length(); i+=4){
hexChar2Decimal(str.substring(i, i + 4));
}
return str;
}
传入的data=C9030C07E70006001E000800270021A729;去掉通信地址和校验码之后的有效数据位是:07E70006001E000800270021;然后我的数据是每4个字节为一个数据,截取后分别是07E7,0006,001E,0008,0027,0021,我代码中就是每截取出一个数据,就调用16进制字符串转10进制数值的方法:
private static int hexChar2Decimal(String hex) {
int num = 0;
String[] overTen = {"A", "B", "C", "D", "E", "F"};
HashMap<String, Integer> hashMap = new HashMap<>();
for (int i = 0; i < 6; i++) {
hashMap.put(overTen[i], i + 10);
}
//取出hashMap中键的集合
Set<String> keySet = hashMap.keySet();
//循环判断
for (int i = 0; i < hex.length(); i++) {
//判断数字部分
if (hex.charAt(i) >= 48 && hex.charAt(i) <= 57) {
num += (hex.charAt(i) - 48) * Math.pow(16, hex.length() - 1 - i);
} else {
//判断字母部分
for (String s : keySet) { //对键的集合进行遍历
if ((hex.charAt(i) + "").equals(s)) { //判断找出相匹配的键
Integer value = hashMap.get(s); //根据键找出相对应的值
num += value * Math.pow(16, hex.length() - 1 - i); //类加求和
}
}
}
}
logger.info("-------------length------------"+num);
return num;
}
转化成功后: