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

CRC-15给出错误的值

谈炳
2023-03-14

第一个64字符行的CRC(“这是教训:永不屈服,永不屈服,永不,永不,)应该是000015FA,我得到的是BFE6EC00。

我的逻辑是:

>

  • 在CRCCalculation中,我将每个字符添加到一个32位无符号整数中,并在64(一行长度)之后将其发送到XOR函数中。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdint.h>
    #include <ctype.h>
    #define POLYNOMIAL 0xA053
    void crcCalculation(char *text, int length)
    {
        int i;
        uint32_t dividend = atoi(text);
        uint32_t  result;
        uint32_t sumText = 0;
    
        // Calculate CRC
        printf("\nCRC 15 calculation progress:\n");
    
        i = length;
    
        // padding
        if(i < 504)
            {
                for(; i!=504; i++)
                    {
                        //  printf("i is %d\n", i);
                        text[i] = '.';
                    }
            }
        // Try calculating by first line of crc by summing the values then calcuating, then add in the next line
        for (i = 0; i < 504; i++)
            {
                if(i%64 == 0 && i != 0)
                    {
                        result = XOR(POLYNOMIAL, sumText);
                        printf(" - %x\n",result);
    
    
                    }
                sumText +=(uint32_t)text[i];
                printf("%c", text[i]);
            }
    
        printf("\n\nCRC15 result : %x\n", result);
    }
    
    uint32_t XOR(uint32_t divisor, uint32_t dividend)
    {
        uint32_t divRemainder = dividend;
        uint32_t currentBit;
        // Note: 4 16 bit chunks
    
        for(currentBit = 32; currentBit > 0; --currentBit)
            {
                // if topbit is 1
                if(divRemainder & 0x80)
                    {
                        //divRemainder = (divRemainder << 1) ^ divisor;
                        divRemainder ^= divisor;
                        printf("%x %x\n", divRemainder, divisor);
                    }
                //  else
                //  divisor = divisor >> 1;
                divRemainder = (divRemainder << 1);
            }
        //return divRemainder;  , have tried shifting to right and left, want to add 4 zeros to front so >>
        //return divRemainder >> 4;
        return divRemainder >> 4;
    }
    
  • 共有1个答案

    吕奇
    2023-03-14

    我看到的第一个问题是顶部位检查,它应该是:

            if(divRemainder & 0x8000)
    

    这个问题没有说明CRC是否被位反射(异或数据到CRC的低阶位,循环的右移位)或不(异或数据到CRC的高阶位,循环的左移位),所以我不能为代码的其余部分提供帮助。

    问题没有说明CRC的初始值(0x0000或0x7FFF),也没有说明CRC是否被后补。

    常规CRC的逻辑是:

    • 将一个字节的数据异或到CRC(高位或低位)
    • 循环CRC 8次(或进行表查找)

    在为整个消息生成CRC之后,可以将CRC追加到消息中。如果为带有附加CRC的消息生成CRC,并且没有错误,则CRC将为零(如果CRC是后补的,则为常量)。

     类似资料:
    • 问题内容: 我想从字符串中删除最后一次出现的“ \”这个特殊字符。我尝试了像这样的字符串函数 但是每次遇到错误时,我都要求加一个额外的报价。同时我发现(“ \”“)用来传递”这个特殊字符。我该如何进行? 问题答案: 您需要使用 字符串中的字符转义特殊字符(依此类推)。因此,在它们之前使用a 会使它成为 文字 ,这意味着java会将其后的内容视为常规字符。 你可以测试看看 将打印。它会打印。 所以:

    • 问题内容: 我在我的应用程序的servlet中使用以下代码 当我运行应用程序并调用servlet时,出现以下错误 我已经在Java版本为JDK 1.6.20的Linux机器上托管了该应用程序。 是什么原因引起的问题… 是编写代码的类,是在上述类中调用方法的servlet … 问题答案: 要在服务器端应用程序中使用AWT类,我相信您需要在“无头”模式下运行。将servlet容器的启动更改为包括: (

    • 来自servlet com.google.gson的未捕获异常。JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_OBJECT,但在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(Reflective TypeAdapter Fact

    • 问题内容: 我创建了一些小的方法作为Util类,例如以下代码: 并且,进行了非常简单的运行,如下所示: 结果是一个很奇怪的日期-> 2017/07/187 搜索了类似的问题,并尝试了TimeZone,Locale,但没有帮助。有什么建议 ? 顺便说一句,这是我的环境: Windows7 x86 JDK 1.8.0.131 x86 Oxygen corrosion of x86 问题答案: 您格式化

    • 我从Spring Boot开始,并尝试提供Rest服务。我正在编写一个控制器,其中有3个方法的RequestMappings。其中两个工作正常,而第三个注释在编写代码时给出了这个错误。 此行有多个标记 - 语法错误,插入“枚举标识符”以完成枚举标头 - 语法错误,插入“枚举正文”以完成枚举声明 我尝试了其他答案,但似乎找不到问题所在。这是我的控制器代码- } 错误出现在最后一行,即最后一个请求映射

    • 问题内容: 我正在使用Python编写一些加密算法,但是我以前从未使用过Python。 首先,看一下这段代码,然后我将解释这个问题, x和y的值为, 我不明白代码的第三行。为了理解第三行,我不得不研究函数,我遇到了这个问题, zip函数帮助元组 根据这个问题的答案,代码, 将输出, 但是当我尝试打印时, 我得到这个输出, 为什么我的输出与原始输出不同? 问题答案: 在Python 3中返回一个迭代