kazenomelodi 2017-03-10 14:38 采纳率: 0%
浏览 874

CRC算法问题,请高手们帮我看看吧!!!!谢谢了!

http://blog.chinaunix.net/uid-20416869-id-173134.html 随便找的博客地址,别人的

unsigned short do_crc(unsigned char *message, unsigned int len)
{
int i, j;
unsigned short crc_reg;

crc_reg = (message[0] << 8) + message[1];
for (i = 0; i < len; i++) 
{
    if (i < len - 2)
        for (j = 0; j <= 7; j++) 
        { 
            if ((short)crc_reg < 0)
                crc_reg = ((crc_reg << 1) + (message[i + 2] >> (7 - i))) ^ 0x1021;
            else 
                crc_reg = (crc_reg << 1) + (message[i + 2] >> (7 - i));      
        }
     else
        for (j = 0; j <= 7; j++) 
        { 
            if ((short)crc_reg < 0)
                crc_reg = (crc_reg << 1) ^ 0x1021;
            else 
                crc_reg <<= 1;             
        }         
}
return crc_reg;

}

显然,每次内循环的行为取决于寄存器首位。由于异或运算满足交换率和结合律,以及与0异或无影响,消息可以不移入寄存器,而在每次内循环的时候,寄存器首位再与对应的消息位异或。改进的代码如下:
unsigned short do_crc(unsigned char *message, unsigned int len)
{
int i, j;
unsigned short crc_reg = 0;
unsigned short current;

for (i = 0; i < len; i++) 
{
    current = message[i] << 8;
    for (j = 0; j < 8; j++) 
    { 
        if ((short)(crc_reg ^ current) < 0)
            crc_reg = (crc_reg << 1) ^ 0x1021;
        else 
            crc_reg <<= 1; 
        current <<= 1;            
    }
}
return crc_reg;

}

上面那个程序搞懂了,下面那个看不懂啊,怎么变成那样的!?帮我看看吧谢谢了!

  • 写回答

1条回答 默认 最新

  • devmiao 2017-03-10 15:32
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)