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

反向倒数CRC-8值的确认?

窦国源
2023-03-14

进入这个问题,我对典型的CRC算法的内部工作几乎一无所知。最初,在尝试代码解决方案之前,我尝试对输入字节进行手工计算,以确认我对algo的理解。这包括用我的0xff初始值对第一个输入字节进行XOR,然后跳到第二个输入字节继续XOR操作。

多次尝试通过典型的XOR操作来确认CRC,同时在每一步期间将MSB移出寄存器,但我始终无法得到我想要的结果。今天,我意识到0xea多项式也被认为是0xd5多项式的反向倒数,其中隐含1+x^8是CRC-8 ALGOS中常用的。这个事实如何改变我手动计算CRC的方式?我读过,在某些情况下,反向导致algo向右移动位,而不是向左移动?

共有1个答案

楚俊杰
2023-03-14

该多项式为x^8+x^7+x^5+x^3+x^2+x+1=>01AF位反向为x^8+x^7+x^6+x^5+x^3+x+1=>0x1EB。示例代码,其中条件异或在移位后完成,因此异或值为0x1EB>>1=0xF5。可以使用256字节的表查找来替换内部循环。

using System;
namespace crc8r
{
    class Program
    {
        private static byte crc8r(byte[] bfr, int bfrlen)
        {
            byte crc = 0xff;
            for (int j = 0; j < bfrlen; j++)
            {
                crc ^= bfr[j];
                for (int i = 0; i < 8; i++)
                    // assumes twos complement math
                    crc = (byte)((crc>>1)^((0-(crc&1))&0xf5));
            }
            return crc;
        }

        static void Main(string[] args)
        {
            byte[] data = new byte[3] {0x02, 0x41, 0x00};
            byte crc;
            crc = crc8r(data, 2);           // crc == 0x9b
            Console.WriteLine("{0:X2}", crc);
            data[2] = crc;
            crc = crc8r(data, 3);           // crc == 0x00
            Console.WriteLine("{0:X2}", crc);
            return;
        }
    }
}

关于“ea”,如果在移位之前对多项式进行XOR',则使用0x1eb(或0x1ea,因为位0将被移位,并且无关紧要)。移位前的XOR需要9位,或者一个0x80的后移位或或XOR,而移位后的XOR只需要8位。

移位前使用0x1EB的示例代码行:

                    crc = (byte)((crc^((0-(crc&1))&0x1eb))>>1);
 类似资料:
  • 这意味着计算CRC所考虑的数据实际上是(第二个字节是而不是)。 根据我在维基百科上可以找到的,“CRC=X8+X5+X4+1”意味着他们使用“CRC-8-Dallas/Maxim”。 但是,当我使用https://crccalc.com/时,输入并点击“calc-crc-8”它报告“crc-8/maxim”,而不是。我是不是漏掉了什么? 更多来自嗅探器的示例: ,所以CRC是 ,所以CRC是

  • http://www.lammertbies.nl/comm/info/crc-calculation.html http://www.codeproject.com/articles/19059/c-ccitt-crc-algorithm 在上面与字节数组{0xee,0x01,0x13,0x00,0x06,0x1c,0x00,0x20,0x1d,0x00,0x00}的链接中,它使用CRC8(po

  • 开始感觉很好...但之后就被难住了。无法确定CRC-16多项式。很有可能这些数据包散列不是与CRC相关的,而是某种家庭酝酿的方案。 阅读Ross N.Williams的“CRC错误检测算法的无痛指南” 不幸的是,我无法访问任何设备的源代码/二进制代码 > 在数据包的最后2个字节上找到CRC。 如果我查看逻辑分析器上的位,我已经将字节表示为MSB-First 因此,数据包0x47366B2EE000

  • 问题内容: 一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么? 具体问题: IntStream提供了range方法来生成特定范围内的,现在我想将其从0切换为负数将无法正常工作,也无法使用 与IntStream我会得到这个编译器错误 错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare

  • 我试图找出如何计算CRC为非常简单的SDLC帧。 使用MLT我捕获流,我看到一些简单的帧被发送出去,如:0x3073F9E3和0x3011EDE3 null 这将给出输出B8ED,所以最后一个字节是ed。 有什么想法吗?

  • 第一个64字符行的CRC(“这是教训:永不屈服,永不屈服,永不,永不,)应该是000015FA,我得到的是BFE6EC00。 我的逻辑是: > 在CRCCalculation中,我将每个字符添加到一个32位无符号整数中,并在64(一行长度)之后将其发送到XOR函数中。 代码: