CRC16 MODBUS 查表法 java实现

JAVA 查表法计算CRC16(CRC16_IBM) 多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或。多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或。多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或。多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或。 阅读详情

记录一次用java实现查表法,原文档中的c语音实现要转换成java,走了不少弯路,百度了一些很多也不对,记录一下最终成功的版本。

原c语言代码:

1、CRC计算函数
WORD ModbusCRC(BYTE * pData, BYTE len)
{
BYTE byCRCHi = 0xff;
BYTE byCRCLo = 0xff;
BYTE byIdx;
WORD crc;
while(len--)
{
byIdx = byCRCHi ^* pData++;
byCRCHi = byCRCLo ^ gabyCRCHi[byIdx];
byCRCLo = gabyCRCLo[byIdx];
}
crc = byCRCHi;
crc <<= 8;
crc += byCRCLo;
return crc;
}
 
CRC 码表高字节
 
BYTE gabyCRCHi[] =
{
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,
0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,
0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,
0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,
0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
0x80,0x41,0x00,0xc1,0x81,0x40
 
};
 
CRC 码表低字节
 
BYTE	gabyCRCLo[] =
{
0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,
0x07,0xc7,0x05,0xc5,0xc4,0x04,0xcc,0x0c,0x0d,0xcd,
0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,
0x08,0xc8,0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,
0x1e,0xde,0xdf,0x1f,0xdd,0x1d,0x1c,0xdc,0x14,0xd4,
0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,
0x11,0xd1,0xd0,0x10,0xf0,0x30,0x31,0xf1,0x33,0xf3,
0xf2,0x32,0x36,0xf6,0xf7,0x37,0xf5,0x35,0x34,0xf4,
0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,
0x3b,0xfb,0x39,0xf9,0xf8,0x38,0x28,0xe8,0xe9,0x29,
0xeb,0x2b,0x2a,0xea,0xee,0x2e,0x2f,0xef,0x2d,0xed,
0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,
0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,0xa0,0x60,
0x61,0xa1,0x63,0xa3,0xa2,0x62,0x66,0xa6,0xa7,0x67,
0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,
0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,
0x78,0xb8,0xb9,0x79,0xbb,0x7b,0x7a,0xba,0xbe,0x7e,
0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,0xb4,0x74,0x75,0xb5,
0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,
0x70,0xb0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,
0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,
0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4b,0x8b,
0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,
0x43,0x83,0x41,0x81,0x80,0x40
};

最终的java版本代码:

import cn.hutool.core.util.NumberUtil;
import java.util.Arrays;

/**
 * 云快充crc计算工具
 *
 * @author jlchen
 */
public class YunCrcUtil {

    private YunCrcUtil() {

    }

    public static final byte[] gabyCRCHi = {
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
        (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40
    };

    public static final byte[] gabyCRCLo = {
        (byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03, (byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5, (byte) 0xC4, (byte) 0x04,
        (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF, (byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09, (byte) 0x08, (byte) 0xC8,
        (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB, (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D, (byte) 0x1C, (byte) 0xDC,
        (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17, (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1, (byte) 0xD0, (byte) 0x10,
        (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3, (byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35, (byte) 0x34, (byte) 0xF4,
        (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F, (byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9, (byte) 0xF8, (byte) 0x38,
        (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B, (byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED, (byte) 0xEC, (byte) 0x2C,
        (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7, (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21, (byte) 0x20, (byte) 0xE0,
        (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3, (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65, (byte) 0x64, (byte) 0xA4,
        (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F, (byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9, (byte) 0xA8, (byte) 0x68,
        (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B, (byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD, (byte) 0xBC, (byte) 0x7C,
        (byte) 0xB4, (byte) 0x74, (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7, (byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71, (byte) 0x70, (byte) 0xB0,
        (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53, (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95, (byte) 0x94, (byte) 0x54,
        (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F, (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59, (byte) 0x58, (byte) 0x98,
        (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B, (byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D, (byte) 0x4C, (byte) 0x8C,
        (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47, (byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81, (byte) 0x80, (byte) 0x40
    };

    public static byte[] calculateCrc(byte[] data) {
        int crc;
        int ucCRCHi = 0x00ff;
        int ucCRCLo = 0x00ff;
        int iIndex;
        for (int i = 0; i < data.length; ++i) {
            iIndex = (ucCRCLo ^ data[i]) & 0x00ff;
            ucCRCLo = ucCRCHi ^ gabyCRCHi[iIndex];
            ucCRCHi = gabyCRCLo[iIndex];
        }

        crc = ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff;
        crc = ( (crc & 0xFF00) >> 8) | ( (crc & 0x00FF ) << 8);
        byte[] bytes = NumberUtil.toBytes(crc);

        return Arrays.copyOfRange(bytes, 2, 4);
    }

}

java实现crc16校验算法(查表法) java代码 //CRC高位字节值 static byte[] auchCRCHi = { (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,... 阅读详情

相关推荐

java版CRC16(Modbus)校验_2016_3_21

在TCP连接时,传递的数据需要加上CRC校验位,验证数据的完成性。 而在获取到服务器端的数据时,楼主偷懒了,未校验CRC WORD ModbusCRC(BYTE * pData, BYTE len) {     BYTE byCRCHi =0xff;     BYTE byCRCLo =0xff;     BYTE byIdx; 0x003C     WORD crc;    

gao2419956747的博客 2538

Java CRC16(modbus)校验

@return {@link String} 校验码。* 字节数组。// CRC寄存器全为1。//获取crc16校验码,* 计算CRC16校验码。参数data中不能有空格。

qq_42714703的博客 978

MODBUS CRC16校验原理及Java实现:从逐位算法到查表法实战

在工业自动化与物联网通信中,数据完整性校验是确保系统稳定运行的关键环节。CRC16作为一种高效、可靠的循环冗余校验算法,广泛应用于Modbus RTU、串口通信及网关协议转换等场景。理解其基于多项式除法的数学原理,能够帮助开发者正确处理字节序、初始值与多项式反转等易错细节。在实际工程实践中,Java开发者常因无符号字节处理不当或高低位顺序颠倒而导致校验失败。本文从CRC16的基本概念出发,解析Modbus协议选用的0x8005多项式模型,并深入对比逐位计算、查表法与局部查表法的实现思路与性能差异,最终结合串

weixin_33462167的博客 254

Java CRC16-modbus校验-CRC modbus校验-Java CRC校验

项目中遇上根据协议进行crc校验的操作,用之前对接过的普通的crc校验发现有些数据能校验通过,有些不能。

u013868665的博客 1450

Java实现CRC16-MODBUS校验:从算法原理到Modbus RTU联调实战

在工业自动化与串口通信领域,数据完整性校验是保证信息可靠传输的基石。CRC(循环冗余校验)作为一种经典且高效的校验机制,被广泛应用于Modbus RTU等现场总线协议中。其核心原理是通过多项式运算将数据帧映射为一个定长校验码,接收方借助相同算法对帧内容进行验证,从而快速发现传输中的位错误或数据篡改。相比复杂的加密机制,CRC更注重效率与实现简单性,这在资源受限的嵌入式环境和实时性要求高的上位机通信中尤为重要。无论是基于Java开发设备驱动,还是解析串口报文,理解CRC的算法参数、字节序处理以及与协议的配合方

weixin_42116058的博客 276

Java实战:CRC16算法优化与性能对比(附源码解析)

本文深入探讨了Java中CRC16校验算法的实现与优化。通过对比逐位计算与查表法两种实现方式,结合详细的源码解析,揭示了查表法在性能上的显著优势(可达5倍以上)。文章还提供了可配置的代码框架,以适配不同协议(如Modbus)的参数要求,并给出了关键的避坑指南和性能测试数据,为开发者在实际项目中高效、正确地应用CRC16算法提供了实用参考。

weixin_29202687的博客 227

crc16modbus查表法_Java CRC16 MODBUS校验算法实现

CRC16 MODBUS校验算法,分两种情况,一是参数是字符串,二是参数是字节数组。参考文章1参考文章2直接上代码,第一种参数是字符串public static void main(String[] args) throws IOException {String frame = "01 03 01 48 00 0c";System.out.println(getCRC(frame));}publ...

weixin_39806779的博客 380

Java实现Modbus CRC16校验:参数化、查表法与帧构建全解析

CRC16是一种基于多项式除法的循环冗余校验机制,广泛应用于工业通信协议如Modbus RTU中,用于检测数据传输错误。其核心原理依赖于初始值、多项式、输入/输出反转、异或掩码五大可配置参数,任意一项不匹配即导致校验失败。技术价值在于以极低开销提供强健的错误检测能力,显著提升串口通信可靠性。典型应用场景包括Java嵌入式网关、边缘计算节点与工业设备对接中间件。本文聚焦Modbus标准CRC-16-IBM(0x8005)与A001变种的Java原生实现,覆盖查表法优化、字节序控制、完整帧构建及真实设备验证,解

weixin_34151004的博客 1130

CRC16/MODBUS 效验 - 查表法 JAVA版本(硬件通信)

不说废话,直接上代码。 package com.dubug; public class CRC16Utils { static byte[] crc16_h = { (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x4

坐看云起时_雨宣 1766

Java CRC16工业级实现:参数化配置、查表法与Modbus/USB校验实战

CRC16是一种基于多项式除法的循环冗余校验算法,其核心原理是将数据流视为二进制多项式,通过模2除法生成固定长度校验码。技术价值在于以极小开销实现强错误检测能力,广泛应用于串口通信、嵌入式固件升级和工业协议(如Modbus RTU、USB描述符)中。不同协议对初始值、多项式、字节序及异或掩码等参数组合存在严格约定,例如Modbus要求0xFFFF初值与0x8005多项式,而USB则需0xFFFF输出异或与位反射。实际开发中,仅靠简单for循环无法覆盖这些变体,必须构建可配置、线程安全、支持边界输入的查表法实

weixin_33508411的博客 187

CRC16校验Java版源码:Modbus A001多项式与查表法实现

CRC16是一种广泛用于串口通信和物联网设备数据完整性校验的算法,其核心原理是基于多项式除法进行移位异或运算。在Modbus RTU、DL/T 645等工业协议中,正确的CRC16校验是确保设备可靠通信的关键。本文提供一份CRC16校验Java版源码,重点实现Modbus标准的A001多项式,包含逐位计算和查表法两种方式,并解决高低字节顺序、参数配置等常见问题。适用于物联网网关、PLC数据采集等场景,帮助开发者快速集成校验逻辑,提升协议解析的稳定性与效率。

weixin_33393017的博客 242

crc java_java实现CRC16 MODBUS校验算法

/*** 查表法计算CRC16校验**@paramdata 需要计算的字节数组*/public static String getCRC3(byte[] data) {byte[] crc16_h ={(byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0...

weixin_39576133的博客 229

Java实现可配置CRC16校验:5大参数详解与工业通信实战

CRC16校验是一种广泛应用于嵌入式、工控和物联网设备的数据完整性验证机制,其核心并非单一算法,而是由多项式、初始值、输入/输出反转、终值异或共5个可配置参数构成的校验体系。理解这些参数的组合逻辑,是解决Modbus RTU、CAN FD、自定义传感器协议等场景中‘Java计算结果与硬件不一致’问题的关键。技术价值在于保障串口、蓝牙、RS485等低层通信的鲁棒性;典型应用场景包括上位机与STM32/PLC联调、边缘网关数据预校验、以及协议逆向分析。本文聚焦CRC16校验Java版实现,深入解析RefIn、X

weixin_34319374的博客 380

java modbus crc_Java CRC16 MODBUS校验算法实现

/*** CRC校验算法工具类*/public classCRCUtil {public staticString getCRC(String data) {data= data.replace(" ", "");int len =data.length();if (!(len % 2 == 0)) {return "0000";}int num = len / 2;byte[] para = n...

weixin_32701893的博客 344

Java版Modbus通信专用CRC16校验工具,支持IBM与反序多项式双模式

一个纯Java实现的轻量级CRC16校验工具类,专为Modbus RTU等工业通信场景优化。直接封装在单个CRC16.java文件中,不依赖任何第三方库,开箱即用。内置两种主流多项式:标准CRC16-IBM(0x8005)和Modbus常用反序变种(0xA001),自动适配不同协议要求。输入任意长度的字节数组,稳定输出2字节校验码,已通过多帧连续Modbus报文实测验证,无整数溢出、边界错位或字节序异常问题。适用于Java环境下的串口通信模块、PLC数据交互中间件、传感器协议解析器、嵌入式网关后台服务等需要

wine的专栏 229

CRC16校验Java实现详解:Modbus串口通信避坑指南

CRC校验是串口通信和工业数据采集中的基础技术,通过多项式除法生成校验码来检测数据传输错误。其核心原理涉及多项式、初始值、输入输出反转等参数配置,不同组合决定不同CRC变体。在Modbus RTU协议中,CRC16校验码用于验证报文完整性,参数配置错误或字节序处理不当会导致通信异常。该技术广泛应用于工业自动化、IoT网关协议解析和串口调试工具开发。本文深入拆解CRC16的Java查表法实现,涵盖A001多项式、参数化配置及常见问题排查,帮助开发者快速集成并避免校验错误。

weixin_33417488的博客 128

使用java计算crc校验和

在线校验http://www.ip33.com/crc.html

大伟的博客 874

ANSYS CFX 自定义函数数据导入实战指南

本文详细介绍了在ANSYS CFX中实现自定义函数数据导入的完整流程与实战技巧。通过具体案例,指导用户如何将外部实验或计算数据(如材料属性随温度变化)导入CFX,创建可调用的函数,并正确关联到仿真模型中,从而显著提升仿真的真实性与准确性。

v6b7n8m9q0的博客 702

Java实现CRC16 MODBUS校验:从位运算原理到串口实战避坑指南

在串口通信与工业设备对接中,CRC16循环冗余校验是保障数据完整性的核心机制。它通过多项式除法将数据帧压缩为16位校验码,任何字节篡改都会导致余数变化,从而被接收方识别。CRC16并非单一算法,MODBUS协议使用的是CRC-16/MODBUS变体,其初始值、多项式方向与字节序均有特定要求,与常见的CRC-16/IBM存在差异。在Java环境下实现时,必须注意byte符号位扩展、无符号右移以及CRC高低字节的排放顺序,否则极易出现设备无响应或校验失败的典型问题。该技术广泛应用于PLC、电表、变频器等基于Mo

weixin_33423874的博客 279

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 145

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864
上一篇: 后端springboot主动推送消息给前端vue
下一篇: 利用SseEmitter实现异步输出执行日志
programmer_cjl
博客等级 码龄8年 2粉丝 4原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值