ModBus CRC16计算

先贴资料 :https://blog.csdn.net/qq_26043945/article/details/123566360

{
    //1、引言
    //(1).CRC寄存器初始值为 0xFFFF;即16个字节全为1。
    //(2).CRC-16/ModBus的模型为:X16+x15+X2+1,由于16进制数只能0~15位,所以舍去X1位,最后得出:0x8005H(1000 0000 0000
    //0101 B)。
    //(3).通过把 0x8005H的“高位”与“低位”进行互换,得到最终的多项式:0xA001H(1010 0000 0000 0001 B)
    private static final int POLY = 0xa001;

    public static String getCrc(byte[] bytes) {
        int crc = 0xFFFF;
        for (byte b : bytes) {
            crc ^= b & 0xFF;
            for (int i = 0; i < 8; i++) {
                if ((crc & 1) != 0) {
                    crc >>= 1;
                    crc ^= POLY;
                } else {
                    crc >>= 1;
                }
            }
        }
        return Integer.toHexString(crc);
    }


}

校验地址:http://www.ip33.com/crc.html

补一个kt的

  private const val POLY = 0xa001
    fun getBytesCrc(bytes: ByteArray): ByteArray {
        var crc = 0xFFFF
        for (b in bytes) {
            crc = crc xor (b.toInt() and 0xFF)
            for (i in 0..7) {
                if ((crc and 1) != 0) {
                    crc = crc shr 1
                    crc = crc xor POLY
                } else {
                    crc = crc shr 1
                }
            }
        }
        return intTo2ByteArray(crc)
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容