请教CRC算法,网上的有好多版本的代码,为啥运算结果都有出入

我看你有戏 2014-07-11 12:46:43
我用代码算的crc码,和用网上下载的工具算出来的crc码不一样
这是为啥
...全文
209 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henzox 2014-07-11
  • 打赏
  • 举报
回复
USHORT Crc16(UCHAR *buff,int length)
{
    USHORT regCRC = 0xffff;
    UCHAR i,j; 

    for (i = 0; i < length; i++) {
        regCRC ^= *buff++;
        for (j = 0; j < 8; j++) {     
            if (regCRC & 0x0001)
                regCRC = regCRC >> 1^0xA001;
            else
                regCRC >>= 1;
        }
    }

    regCRC = ((regCRC << 8) & 0xFF00) | ((regCRC >> 8) & 0x00FF);
	return regCRC;
}
Crc16 的代码,modbus 中的标准算法,亲测可用。
玄之丞 2014-07-11
  • 打赏
  • 举报
回复
没设置的话,初值默认都是一样的。 初值一样,输入的2进制流一致的话,结果一定是唯一的值。和md5等哈希算法一样。 但是注意一下编码,同样看到的一个汉字,编码可能有好几种, utf8 gbk ,编码不一致话,看起来一样,但是结果就不一样了。
我看你有戏 2014-07-11
  • 打赏
  • 举报
回复
引用 1 楼 assembly 的回复:
初值不同,多项式不同,结果是否取反,都有影响。
哦,好的谢谢啊,我还以为是像md5那样会出来一个唯一的值
Henzox 2014-07-11
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 Henzox 的回复:]
USHORT Crc16(UCHAR *buff,int length)
{
    USHORT regCRC = 0xffff;
    UCHAR i,j; 

    for (i = 0; i < length; i++) {
        regCRC ^= *buff++;
        for (j = 0; j < 8; j++) {     
            if (regCRC & 0x0001)
                regCRC = regCRC >> 1^0xA001;
            else
                regCRC >>= 1;
        }
    }

    regCRC = ((regCRC << 8) & 0xFF00) | ((regCRC >> 8) & 0x00FF);
	return regCRC;
}
Crc16 的代码,modbus 中的标准算法,亲测可用。
UCHAR i的取值范围0..255;int length的取值范围-32767..32768或-2147483648..2147483647 for (i = 0; i < length; i++) {//有死循环的危险! [/quote] 这是一道很好的面试题。
赵4老师 2014-07-11
  • 打赏
  • 举报
回复
引用 4 楼 Henzox 的回复:
USHORT Crc16(UCHAR *buff,int length)
{
    USHORT regCRC = 0xffff;
    UCHAR i,j; 

    for (i = 0; i < length; i++) {
        regCRC ^= *buff++;
        for (j = 0; j < 8; j++) {     
            if (regCRC & 0x0001)
                regCRC = regCRC >> 1^0xA001;
            else
                regCRC >>= 1;
        }
    }

    regCRC = ((regCRC << 8) & 0xFF00) | ((regCRC >> 8) & 0x00FF);
	return regCRC;
}
Crc16 的代码,modbus 中的标准算法,亲测可用。
UCHAR i的取值范围0..255;int length的取值范围-32767..32768或-2147483648..2147483647 for (i = 0; i < length; i++) {//有死循环的危险!
Henzox 2014-07-11
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
unsigned short CRC16(unsigned char *buf,int len) {
    unsigned short CRC = 0xffffu;
    int i,j;

    for (i=0;i<len;i++) {
        CRC ^= *buf++;
        for (j=0;j<8;j++) {
            if (CRC & 0x0001u)
                CRC = CRC >> 1^0xA001u;
            else
                CRC >>= 1;
        }
    }

    CRC = ((CRC << 8) & 0xFF00u) | ((CRC >> 8) & 0x00FFu);
    return CRC;
}
赵老师对代码的修改态度很严谨,赞一个。
赵4老师 2014-07-11
  • 打赏
  • 举报
回复
unsigned short CRC16(unsigned char *buf,int len) {
    unsigned short CRC = 0xffffu;
    int i,j;

    for (i=0;i<len;i++) {
        CRC ^= *buf++;
        for (j=0;j<8;j++) {
            if (CRC & 0x0001u)
                CRC = CRC >> 1^0xA001u;
            else
                CRC >>= 1;
        }
    }

    CRC = ((CRC << 8) & 0xFF00u) | ((CRC >> 8) & 0x00FFu);
    return CRC;
}
赵4老师 2014-07-11
  • 打赏
  • 举报
回复
引用 4 楼 Henzox 的回复:
USHORT Crc16(UCHAR *buff,int length)
{
    USHORT regCRC = 0xffff;
    UCHAR i,j; 

    for (i = 0; i < length; i++) {
        regCRC ^= *buff++;
        for (j = 0; j < 8; j++) {     
            if (regCRC & 0x0001)
                regCRC = regCRC >> 1^0xA001;
            else
                regCRC >>= 1;
        }
    }

    regCRC = ((regCRC << 8) & 0xFF00) | ((regCRC >> 8) & 0x00FF);
	return regCRC;
}
Crc16 的代码,modbus 中的标准算法,亲测可用。
收藏待用。
assembly 2014-07-11
  • 打赏
  • 举报
回复
初值不同,多项式不同,结果是否取反,都有影响。
我看你有戏 2014-07-11
  • 打赏
  • 举报
回复
前言最近随着计算机的发展,软件日益更新,有很多公司发布的产品遭到篡改和破解,在总众多年的历史种逐渐形成了软件保护与软件破解之间的对抗产生了软件逆向工程这本门技术将在如下的课程讲解各种软件逆向知识,软件保护知识,已经破解脱壳反调试知识,为初期学软件逆向不懂而又迷茫的同学门指明一条道路此套课堂能有效帮助同学们解决软件逆向中所遇到的大部分问题大纲软件逆向工程高级班分为反调试篇汇编篇算法篇补丁篇HOOK篇将在如上这几篇对软件逆向的各个方面进行详解,包括网络验证的分析思路,封包算法的提取,以及各种软件保护技术,无论哪一篇都会从诸多个方面的细节进行详解反调试篇:分为PEB,时间校验,CRC,NtQuery函数,内核过渡等知识要领与诸多方面的综合性详解,细节分为每一节课,每一节课目标清晰无比,每一节深入精髓进行讲解!汇编篇:一个程序编译完成之后是如何通过在计算机运行起来的,其中少不了底层知识的汇编指令,汇编篇中将深入浅出的带领同学们对MASM32SDK的一套汇编库中开发程序,熟悉汇编的原理,如何运用汇编写出一套花指令,并且去除指令,方便以后的算法学习以及为今后的学习打下坚实的基础算法篇:随着编程语言的发展,编程语言的标准也在发展,一些编译器善于运用数学的手法,对程序进行各种优化,然后我们进行分析,我们得需要一步步还原这个优化或清晰了解这个优化才有可能掌握这个数学模型优化,进一步还原代码算法篇知识要领将在优化,技巧这方面表现的玲离尽致!此篇会带领同学们分析多个语言的算法,包括C/C++算法还原代码还原易语言代码还原 算分开库的实现,制作自己的第一个注册机等!补丁篇:说到补丁,同学们可能第一个想到的就是对方一些网络验证所用到的技巧,我的课程这一方面虽有涉及,但是补丁技术远远不止这一点,我的课程会详解更多的补丁知识原理,包括什么是补丁,补丁的真正概念,前辈们是如何善用补丁对程序的漏洞进行修补损坏的程序。将在此篇一一介绍HOOK篇:详细详解了各种HOOK的原理以及实现代码,包括网上流行所说的超级HOOK,COMHOOK,协议HOOK,代理中转等方法,怎么定位关键位置,环境的保存知识要领,hook关键的注意事项,为自己以后做hook行业打下坚实的基础课程每一个细节讲究的深入骨髓,通俗易懂的学习方式,全程贯彻原理,软件逆向中必不可少少的教程!

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧