【问题标题】:Calculating CRC initial value instead of appending the CRC to payload计算 CRC 初始值而不是将 CRC 附加到有效负载
【发布时间】:2015-04-27 04:46:04
【问题描述】:

我实现的大多数 CRC 都是将计算出的 CRC 值附加到消息(有效负载)中,并在接收器处检查所有字节后的零结果,包括。 CRC 值通过 CRC 寄存器提供。 显然这是一种非常标准的方法。

现在我想使用不同的方法:

  1. 根据负载计算一个值。
  2. 使用该值作为 CRC 寄存器的初始值之前 消息字节(有效负载)通过 CRC 寄存器馈送 使得有效载荷的最后一个字节之后的结果 被馈入的将为零。

执行此操作的最佳方法是什么? 是否有一个好主意或一些指针可以深入挖掘?

ps:我为什么要这样做?在某些应用程序 (ROM) 中,我无法附加数据,因为数据存储在 ROM 地址空间的末尾。所以我想预加载 CRC 寄存器或将值添加到消息中。

【问题讨论】:

    标签: reverse patch crc crc32 crc16


    【解决方案1】:

    我现在已经为上述问题编写了一个解决方案,这比我最初想象的要容易。

    我发现了几篇关于如何伪造 CRC 的文章。这意味着如何以计算出的 CRC 值具有预定义的方式修补数据 价值。

    使用这种方法,我只需要使用我实际的最后一个字节 有效载荷作为 CRC 值,这是非常明显的。

    最后,我只需要使用我的有效载荷数据计算“反向”CRC。 这个计算的结果是我必须使用的初始值 计算 CRC。

    由于我正在开发一个内存非常有限的系统,因此我减小了 包含 256 个条目(CRC32 为 1024 字节)的 CRC 表向下 到 16 个条目(64 个字节),现在分两步处理每个字节 仍然比移位快得多。

    // Reverse CRC table for Castagnoli polynomial (0x1EDC6F41)
    static const unsigned long crc32c_revTable[16] =
    {
        0x00000000L, 0x05EC76F1L, 0x0BD8EDE2L, 0x0E349B13L,
        0x17B1DBC4L, 0x125DAD35L, 0x1C693626L, 0x198540D7L,
        0x2F63B788L, 0x2A8FC179L, 0x24BB5A6AL, 0x21572C9BL,
        0x38D26C4CL, 0x3D3E1ABDL, 0x330A81AEL, 0x36E6F75FL
    };
    
    unsigned long calcReverseCRC32C(unsigned long crc32c, 
                                    const unsigned char* pData,
                                    unsigned long len)
    {
        while (len--)
        {
            crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
            crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
            crc32c ^= *pData--;
        }
    
        return crc32c;
    }
    

    用法:

    {
        // This array contains test data with 4 bytes CRC appended
        // The result of CRC-32C calculation using this data is zero
        unsigned char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9',
                               0x7c, 0x6d, 0xf9, 0x1c};
    
        unsigned long expectedResultOfCRC = 0;
        unsigned long init = calcReverseCRC32C(expectedResultOfCRC,
                                               &arr[sizeof(arr) -1],
                                               sizeof(arr) );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-01
      • 2011-11-08
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2017-08-02
      • 2017-02-11
      相关资源
      最近更新 更多