1. > 电脑手机 >

crc16在线计算(crc16校验码计算工具)

本文目录一览:

crc16的算法?

#define CRC16_POLYNOMIAL 0x1021 // CRC_16校验方式的多项式.

typedef unsigned char uchar;

typedef unsigned int uint;

typedef unsigned long ulong;

typedef enum tagBoolean { FALSE, TRUE } bool;

ulong g_ulTable[256];

// CRC_16方式校验的初始化函数, 计算CRC_16余数表.

void _far CRC16Init(void)

{

uint nRemainder;

int n, m;

ulong *pulTable = g_ulTable;

for(n = 0; n 256; n ++)

{

nRemainder = (uint)n 8;

for(m = 8; m 0; m --)

{

if(nRemainder 0x8000)

{

nRemainder = (nRemainder 1) ^ CRC16_POLYNOMIAL;

}

else

{

nRemainder = (nRemainder 1);

}

}

*(pulTable + n) = nRemainder;

}

}

// 以CRC_16方式计算一个数据块的CRC值.

// pucData - 待校验的数据块指针.

// nBytes - 数据块大小, 单位是字节.

// 返回值是无符号的长整型, 其中低16位有效.

ulong _far CRC16Calc(uchar *pucData, int nBytes)

{

uint nRemainder, nRet;

int n;

uchar index;

ulong *pulTable = g_ulTable;

nRemainder = 0x0000;

for(n = 0; n nBytes; n ++)

{

index = (uchar)CRCBitReflect(*(pucData + n), 8) ^ (nRemainder 8);

nRemainder = (uint)*(pulTable + index) ^ (nRemainder 8);

}

nRet = (uint)CRCBitReflect(nRemainder, 16) ^ 0x0000;

return(nRet);

}

// 反转数据的比特位, 反转后MSB为1.

// 反转前: 1110100011101110 0010100111100000

// 反转后: 1111001010001110 1110001011100000

ulong _far CRCBitReflect(ulong ulData, int nBits)

{

ulong ulResult = 0x00000000L;

int n;

for(n = 0; n nBits; n ++)

{

if(ulData 0x00000001L)

{

ulResult |= (ulong)(1L ((nBits - 1) - n));

}

ulData = (ulData 1);

}

return(ulResult);

}

关于易语言CRC计算 16位的CRC计算

下面我们以crc-16为例来说明任意长度数据流的crc校验码生成过程。我们采用将数据流分成若干个8bit字符,并由低字节到高字节传送的并行方法来求crc校验码。具体计算过程为:用一个16bit的寄存器来存放crc校验值,且设定其初值为0x0000;将数据流的第一个8bit与16bit的crc寄存器的高字节相异或,并将结果存入crc寄存器高字节;crc寄存器左移一位,最低1bit补零,同时检查移出的最高1bit,若移出的最高1bit为0,则继续按上述过程左移,若最高1bit为1,则将crc寄存器中的值与生成多项式码相异或,结果存入crc寄存器值;继续左移并重复上述处理方法,直到将8bit数据处理完为止,则此时crc寄存器中的值就是第一个8bit数据对应的crc校验码;然后将此时crc寄存器的值作为初值,用同样的处理方法重复上述步骤来处理下一个8bit数据流,直到将所有的8bit字符都处理完后,此刻crc寄存器中的值即为整个数据流对应的crc校验码。

下面示出了其计算过程的流程图:

在用c语言编写crc校验码的实现程序时我们应该注意,生成多项式

对应的十六进制数为0x18005,由于crc寄存器左移过程中,移出的最高位为1时与

相异或,所以与16bit的crc寄存器对应的生成多项式的十六进制数可用0x8005表示。下面给出并行处理8bit数据流的c源程序:

unsigned

short

crc_dsp(unsigned

short

reg,

unsigned

char

data_crc)

//reg为crc寄存器,

data_crc为将要处理的8bit数据流

{

unsigned

short

msb;

//crc寄存器将移出的最高1bit

unsigned

short

data;

unsigned

short

gx

=

0x8005,

i

=

0;

//i为左移次数,

gx为生成多项式

data

=

(unsigned

short)data_crc;

data

=

data

8;

reg

=

reg

^

data;

do

{

msb

=

reg

0x8000;

reg

=

reg

1;

if(msb

==

0x8000)

{

reg

=

reg

^

gx;

}

i++;

}

while(i

8);

return

(reg);

}

以上为处理每一个8bit数据流的子程序,在计算整个数据流的crc校验码时,我们只需将crc_reg的初值置为0x0000,求第一个8bit的crc值,之后,即可将上次求得的crc值和本次将要处理的8bit数据作为函数实参传递给上述子程序的形参进行处理即可,最终返回的reg值便是我们所想得到的整个数据流的crc校验值。

crc16校验码怎么算

coins[3]+coins[4]+coins[5]) {

if(coins[0]+coins[3] == coins[1]+coins[4])

compare(coins, 5, 2, 0);

else if(coins[0]+coins[3] coins[1]+coins[4])

compare(coins, 3, 1, 0);

if(coins[0]+coins[3] coins[1]+coins[4])

compare(coins, 4, 0, 1);

CRC码的计算方法

信息码添四个零,去除多项式,得到余数,为****

那么传送的12个比特就是11001101****。

Computer Networks 自顶向下方法书里有!

CRC16校验码如何计算

7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E

方法如下:

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息