本文目录一览:
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 举报,一经查实,本站将立刻删除。