java CRC16校验 包含高低位互换,字符串转16进制byte数组,16进制数组转字符串串口工具类

public class Utils {

    /**
     * 十六进制的字符串转换为byte数组
     *
     * @param hex16Str
     *            十六进制字符串
     * @return byte数组
     */
    public static byte[] conver16HexToByte(String hex16Str) {
        char[] c = hex16Str.toCharArray();
        byte[] b = new byte[c.length / 2];
        for (int i = 0; i < b.length; i++) {
            int pos = i * 2;
            b[i] = (byte) ("0123456789ABCDEF".indexOf(c[pos]) << 4 | "0123456789ABCDEF"
                    .indexOf(c[pos + 1]));
            //System.out.print(b[i] + ",");
        }
        return b;
    }

    /**
     * 字节数组转16进制
     *
     * @param bytes
     *            需要转换的byte数组
     * @return 转换后的Hex字符串
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() < 2) {
                sb.append(0);
            }
            sb.append(hex);
        }
        return sb.toString().toUpperCase();
    }


    /**
     * CRC校验码
     *
     * @param hex16Str   十六进制字符串
     * @param format 是否需要高低位互换,佳岚的需要高低位互换
     * @return    CRC校验码
     */
    public static String makeCRC(String hex16Str,boolean format) {
        byte[] bytes = conver16HexToByte(hex16Str);
        int crc = 0x0000ffff;
        for (int i = 0; i < bytes.length; i++) {
            crc ^= ((int) bytes[i] & 0x000000ff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 0x00000001) != 0) {
                    crc >>= 1;
                    crc ^= 0x0000a001;
                } else {
                    crc >>= 1;
                }
            }
        }
        // 高低位互换,输出符合相关工具对Modbus CRC16的运算
        if(format){
            crc = ((crc & 0xff00) >> 8) | ((crc & 0x00ff) << 8);
        }
        return String.format("%04X", crc);
    }
}

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用和引用的内容,我们可以将16进制字符串换为byte数组。在Java中,一个16进制字符可以用4二进制来表示,而一个byte占用8。所以,我们可以将每两个16进制字符组合成一个byte。具体的换步骤如下所示: 1. 首先,将16进制字符串按照每两个字符一组进行分割,并保存在一个String数组中。 2. 然后,使用循环遍历这个String数组,将每两个16进制字符换为一个byte。可以使用Java的parseInt()方法将16进制字符换为整数,然后将整数强制换为byte类型。 3. 最后,将换得到的byte依次添加到一个byte数组中。 通过以上步骤,我们就可以将16进制字符串换为byte数组了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PHP CRC8算法-集成十六进制byte数组byte数组转十六进制](https://download.csdn.net/download/sept_jun/18865747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [16进制byte换](https://blog.csdn.net/qiaoyl113/article/details/52609447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值