unsigned short crc16_ccitt(unsigned char data, unsigned short crc)
{
unsigned short ccitt16 = 0x1021; int i; crc ^= (data<<8); /* 新的数据与将原来的余数(就是crc)相加(加法就是异或操作) */ /* 求数据的CRC校验码 */
for (i=0; i<8; i++)
{
if (crc & 0x8000) /* 最高位为1,减去除数 */
{
crc <<= 1;
crc ^= ccitt16;
}
else /* 最高位为0,不需要减去除数 */
{
crc <<= 1; /* 直接移位 */
}
} return crc;
}
/* 这是个主程序,表示如何计算5个字节的CRC */
void main()
{
int i;
unsigned short crc;
char data[5] = { 0x71, 0x88, 0x93, 0xa5, 0x13 }; /* 计算这5个数据的CRC校验码 */ crc = 0; for (i=0; i<5; i++)
{
crc = crc16_ccitt(data[i], crc);
} printf("crc is %x", crc);
}
{
unsigned short ccitt16 = 0x1021; int i; crc ^= (data<<8); /* 新的数据与将原来的余数(就是crc)相加(加法就是异或操作) */ /* 求数据的CRC校验码 */
for (i=0; i<8; i++)
{
if (crc & 0x8000) /* 最高位为1,减去除数 */
{
crc <<= 1;
crc ^= ccitt16;
}
else /* 最高位为0,不需要减去除数 */
{
crc <<= 1; /* 直接移位 */
}
} return crc;
}
/* 这是个主程序,表示如何计算5个字节的CRC */
void main()
{
int i;
unsigned short crc;
char data[5] = { 0x71, 0x88, 0x93, 0xa5, 0x13 }; /* 计算这5个数据的CRC校验码 */ crc = 0; for (i=0; i<5; i++)
{
crc = crc16_ccitt(data[i], crc);
} printf("crc is %x", crc);
}
解决方案 »
- 关于一个计时计分器的问题
- 爲什麽將05248寫入表中確變成了5248?麻煩大家指點一下
- 急,用delphi写asp传送过来的信息保存到数据库中,怎么总是有问题?
- 谁可以把从TComponent继承下来的控件转化成Active Control. 100分.在线等待.
- 100分求教数据库设计方面的问题,一个值得大家关注的问题
- sql储存问题
- 如何在所画的直线上表示进度
- 出 500 分 外加人民币 200 元购买一份源程序(代理服务器软件,要求能分别让各机在不同时间内限上网,最好有日志记录)2/x
- 有谁有关于DBIMAGE的显示和存储的例子吗?谢了!
- 誰有屏莫抓取圖標的工具軟件!!!!
- kbmMW2.61 提交SQL到数据库时的问题 三个字变为一个半字
- 各位D友来嗑嗑,关于网游加速器。
const
data: array[0..4] of byte=($71,$88,$93,$a5,$13);
var
intI: Integer;
rst: word;
function Crc16(data:byte;var crc:word):word;
var
i: integer;
begin
crc := crc xor (data shl 8);
for i:=0 to 7 do
if (crc and $8000) <> 0 then
crc := (crc shl 1) xor $1021
else crc := crc shl 1;
Result := crc;
end;
begin
rst:=0;
for intI:=0 to 4 do
rst:= Crc16(data[intI],rst);
showmessage(inttostr(rst));
end;