当前位置: 首页 > 知识库问答 >
问题:

CRC相似算法的比较与差异

於彬
2023-03-14

我在读关于CRCs,我偶然发现了CRC目录和这篇关于CRC-CCITT的文章。

我基于第二个链接实现了mycrc16(参见下面的代码)。

我是不是遗漏了异或运算的一些属性?在我看来,这两个算法应该有相同的输出(当然不考虑第一个算法的增强),但它们没有。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

uint16_t MyCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
{
        for(int byte=0; byte<length; ++byte)
        {
                for(int bit=7; bit>=0; --bit)
                {
                        bool doXor = false;
                        if(crc & 0x8000)
                        {
                                doXor = true;
                        }
                        crc <<= 1;
                        if(data[byte] & (1 << bit))
                        {
                                crc += 1;
                        }
                        if(doXor)
                        {
                                crc ^= poly;
                        }
                }
        }

        //augument the crc with 0s
        for(int i=0; i<16; i++)
        {
                bool doXor = false;
                if(crc & 0x8000)
                {
                        doXor = true;
                }

                crc = crc << 1;
                if(doXor)
                {
                        crc ^= poly;
                }
        }

        return crc;
}

uint16_t OtherCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
{
        for(int i=0; i<length; i++)
        {
                crc = crc ^ (data[i] << 8);
                for (int bit = 0; bit< 8; bit++)
                {
                        bool doXor = false;
                        if(crc & 0x8000)
                        {
                                doXor = true;
                        }
                        crc <<=1;

                        if(doXor)
                        {
                                crc ^= poly;
                        }
                }
        }
        return crc;
}


int main(void) {
    // your code goes here
    uint16_t poly = 0x1021;

    unsigned char c[] = "123456789";
    printf("My CRC = %04x\n", MyCrc16(c, 9, poly, 0xffff));
    printf("Other CRC = %04x\n", OtherCrc16(c, 9, poly, 0xffff));
    return 0;
}

PS:可执行代码:http://ideone.com/mkuqqq

共有1个答案

苏畅
2023-03-14

如果CRC的初始值为零,则两种方法产生相同的CRC。但是,如果CRC的初始值是非零,那么MyCrc16在开始包括任何数据位之前循环该初始值16次,就像它用16个零位作为数据前缀一样。对于一个非零的初始CRC,MyCrc16需要将初始值反转16次,因此在将初始值向前循环16次后,它与其他CRC16中使用的初始值相同。对于初始值为0xFFFF,反向循环16次得到0x84CF。评论中指出的以下变化将导致两种方法产生相同的儿童权利公约:

    printf("My CRC = %04x\n", MyCrc16(c, 9, poly, 0x84cf));  /* change to 0x84cf */
    printf("Other CRC = %04x\n", OtherCrc16(c, 9, poly, 0xffff));
 类似资料:
  • 更新:为了更明显地说明我正在努力做的事情:我将拥有5000万以上的设备流媒体音频。流平均为100KB,峰值流量时为200K流/分钟。我正在寻找一种存储解决方案来满足这种需求。我一直在研究Bookkeeper、Kafka、Ignite、Cassandra和Redis。到目前为止,我只对redis和ignite进行了基准测试,但我很惊讶ignite这么慢。

  • 本文向大家介绍php比较相似字符串的方法,包括了php比较相似字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php比较相似字符串的方法。分享给大家供大家参考。具体分析如下: 这里通过php的similar_text函数比较两个字符串的相似性。 希望本文所述对大家的php程序设计有所帮助。

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 问题内容: 我想将多个字符串相互比较,并找到最相似的字符串。我想知道是否有任何库,方法或最佳实践会返回我哪些字符串与其他字符串更相似的字符串。例如: “The quick fox jumped” -> “The fox jumped” “The quick fox jumped” -> “The fox” 该比较将返回第一个比第二个更相似。 我想我需要一些方法,例如: 某处有这样的东西吗? 编辑:

  • 问题内容: 我知道这是一个包装类,它包装数字。今天,我看到了另一个主要区别: 我真奇怪! 因此,如果每次使用,我们都必须执行以下操作: 我无法解释为什么Double直接将比较做错了。请为我解释。 问题答案: 而在技术上两个不同的对象和运营商只比较引用。 更好,因为它比较值而不是引用。但是仍然不理想。直接比较浮点值应始终将一些误差(ε)考虑在内()。 注意: 这里的比较会产生,但是比较复杂(内部缓存

  • 问题内容: 我花了很多时间研究一个库,该库使我可以用Java比较图像。 我并没有真正找到有用的东西,也许我的GoogleSearch技能还不够高,所以我想问一下你们是否可以指出我在哪里可以找到这样的东西。 基本上我想做的是将两个图像相互比较,并获得两个相似程度的值。大约一个百分比。 我希望你们有我可以使用的东西,我自己不知道该怎么写… PS:不一定必须使用Java,这只是我的应用程序将要运行的环境