Java实现将16进制的字符串转化为10进制

文章讲述了在处理通信协议时,如何从16进制的字符串中截取有效数据并转换成10进制数值。代码示例展示了如何去除通信地址和CRC校验码,然后将每4个字节的16进制数据转化为10进制。使用HashMap存储16进制字母的对应值,并进行计算。
摘要由CSDN通过智能技术生成

最近写通信相关的代码,获取了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;
    }

转化成功后: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值