代码模块
C/C++
quint16 calculate_crc16(quint16 wCRCin, quint16 wCPoly, quint16 wResultXOR,
bool input_invert, bool ouput_invert, const char *puchMsg, int usDataLen)
{
quint8 wChar = 0;
while (usDataLen--)
{
wChar = *(puchMsg++);
if(input_invert)
{
quint8 temp_char = wChar;
wChar = 0;
for(int i = 0; i < 8; ++i)
{
if(temp_char & 0x01)
wChar |= 0x01 << (7 - i);
temp_char >>= 1;
}
}
wCRCin ^= (wChar << 8);
for (int i = 0; i < 8; i++)
{
if (wCRCin & 0x8000)
wCRCin = (wCRCin << 1) ^ wCPoly;
else
wCRCin = wCRCin << 1;
}
}
if(ouput_invert)
{
quint16 temp_short = wCRCin;
wCRCin = 0;
for(int i = 0; i < 16; ++i)
{
if(temp_short & 0x01)
wCRCin |= 0x01 << (15 - i);
temp_short >>= 1;
}
}
return (wCRCin ^ wResultXOR);
}
C#
public static ushort crc16(byte[] p_data, ushort p_length)
{
byte i;
uint indexData = 0;
ushort data;
ushort crc = 0xffff;
const ushort POLY = 0x8408;
if (p_length == 0)
return (ushort)(~crc);
do
{
data = (ushort)(0xff & p_data[indexData++]);
for (i = 0; i < 8; i++)
{
if (((crc & 0x0001) ^ (data & 0x0001)) != 0)
crc = (ushort)((crc >> 1) ^ POLY);
else crc >>= 1;
data >>= 1;
}
} while (--p_length > 0);
crc = (ushort)~crc;
data = crc;
crc = (ushort)((crc << 8) | (data >> 8 & 0xff));
return (crc);
}
验证工具
工具下载
工具下载链接
数据验证
多项式:0x1021,初始值:0xFFFF,输入翻转:False,输出翻转:False,结果异或值:0x0000 源数据:
AA 55 00 00 82 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A 24 47 4E 52 4D 43 2C 2C 56 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 4E 2A 34 44 0D 0A 24 47 4E 47 47 41 2C 2C 2C 2C 2C 2C 30 2C 30 30 2C 39 39 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A 24 47 4E 52 4D 43 2C 2C 56 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 4E 2A 34 44 0D 0A 24 47 4E 47 47 41 2C 2C 2C 2C 2C 2C 30 2C 30 30 2C 39 39 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A FD B0
程序计算出的,校验值:FD B0,字符串的最后两个byte
将字符串拷入软件中,可以看到: 该工具的类型有很多,将要验证的字符串拷入后,点击GO,即可生成全部类型的CRC校验值。 可以用该工具的生成值来检验程序的计算是否正确。
|