Java语言 ASCII to Hex 互转(IOT-示例)

概述

        最近想起之前做的IOT项目,使用JAVA写了一个<ascii to hex> 示例,防止误删,在此做个笔录,方便后续查阅;同时,希望能帮助到有用的攻城狮们,加油加油!

IDE:IntelliJ IDEA 2020.2
JDK:jdk-11.0.8_windows-x64_bin.exe

一、代码

public class Main {
    public static void main(String[] args) throws NumberFormatException {
        System.out.println("\n***** Convert ASCII to Hex *****");
        //String str = "I Love Java!";
        String str = "862177040021951";
//        String str = "163";
        System.out.println("Original input : " + str);

        String hex = convertStringToHex(str);

        System.out.println("\n***** Convert Hex to ASCII *****");
        System.out.println("Hex : " + hex);
        System.out.println("ASCII : " + convertHexToString(hex));

        String val = "343630313131313734333036393430";
        System.out.println("NB-IOT设备的IMEI号值为:" + convertHexToString(val));

        System.out.println("****************************************************\n");

        hex = convertStringToHex("460111174306940");
        System.out.println("\n***** Convert Hex to ASCII *****");
        System.out.println("Hex : " + hex);
        System.out.println("ASCII : " + convertHexToString(hex));

        String vall = "226";
        System.out.println("NB-IOT设备的IMSI号值为:" + convertHexToString(vall));

//        System.out.println("******************************************\n");
//        String Latitude = "10D17C0D";
//        System.out.println("经度值为:" + convertHexToFloat(Latitude));

//        System.out.println("******************************************\n");
//        String Longitude = "80C9DD43";
//        System.out.println("纬度值为:" + convertHexToFloat(Longitude));

//        String s="80C9DD43";
//        Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16));
//        System.out.println(value);
//
//        Float f=0.15490197f;
//        System.out.println(Integer.toHexString(Float.floatToIntBits(f)));

        Test test = new Test();
        String str16 = "M5311-MCMH0S03,HT_Manhole_V2.1_191209,HT_12221_V2.0_190715,868163040748607,460040829606402,898602B8261870737402,19/12/10,14:01:41,2,2,0,255,255,16,21,3.80,24.9,0,0,86,0";
        String crc2Code = test.getCRC2Code(str16.getBytes());
        System.out.println("crc2Code:" + crc2Code);
        System.out.println("len:" + str16.length());
        System.out.println("len:" + str16.getBytes().length);

    }

    public static String convertStringToHex(String str) {

        char[] chars = str.toCharArray();

        StringBuffer hex = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            hex.append(Integer.toHexString((int) chars[i]));
        }

        return hex.toString();
    }

    public static String convertHexToString(String hex) {

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        //49204c6f7665204a617661 split into two characters 49, 20, 4c...
        for (int i = 0; i < hex.length() - 1; i += 2) {

            //grab the hex in pairs
            String output = hex.substring(i, (i + 2));
            //convert hex to decimal
            int decimal = Integer.parseInt(output, 16);

            //convert the decimal to character
            sb.append((char) decimal);

            temp.append(decimal);
        }
        System.out.println("Decimal : " + temp.toString());

        return sb.toString();
    }

    public static String convertHexToFloat(String hex) {

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        return sb.toString();
    }

    public static class Test {
        public String getCRC2Code(byte[] bytes) {
//        ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。
//        CRC 码由发送设备计算, 放置于所发送信息帧的尾部。
//        接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC,
//        比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。
//
//        1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
//        2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
//        3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
//        4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
//        5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
//        6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
//        7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
//        8) 最后得到的 CRC寄存器内容即为 CRC码。

            int CRC = 0x0000ffff;
            int POLYNOMIAL = 0x0000a001;

            int i, j;
            for (i = 0; i < bytes.length; i++) {
                CRC ^= (int) bytes[i];
                for (j = 0; j < 8; j++) {
                    if ((CRC & 0x00000001) == 1) {
                        CRC >>= 1;
                        CRC ^= POLYNOMIAL;
                    } else {
                        CRC >>= 1;
                    }
                }
            }
            //高低位转换,看情况使用(通讯开发就规定校验码高位在前低位在后,也就不需要转换高低位)
            //CRC = (CRC & 0x0000FF00) >> 8 | ( (CRC & 0x000000FF ) << 8);
            return Integer.toHexString(CRC);
        }
    }

    public static long parseLong(String s, int radix) throws NumberFormatException {
        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
        }
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
        }

        long result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        long limit = -Long.MAX_VALUE;
        long multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Long.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++), radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }

}


class NumberFormatException extends IllegalArgumentException {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public NumberFormatException(String s) {
        super(s);
    }

    static NumberFormatException forInputString(String s) {
        return new NumberFormatException("For input string: \"" + s + "\"");
    }
}

二、运行结果

三、总结

        多劳多得,加油加油 ^_^ !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值