STM 32 上的 CRC32 CRC 外设:相同数据的字节流和字流给出不同的结果
CRC32 CRC peripheral on STM 32 : byte and word streams of same data give different results
我使用的是 STM32 ARM CRC 外围设备,当以字节形式馈入时与以字形式馈入时相比,我为相同的数据获得不同的 CRC 代码。
使用字节字长和小字对齐的数据串:
const char *ts4 = "The quick brown fox jumped over the lazy brown dog."; // 52 CHARS divisible by 4;
缓冲区大小为 strlen(ts4)
的 CRC32 为 ~ 0x01fba559
0xfe045aa6.
然后将 CRC 配置为 WORD 大小(将缓冲区大小设置为 strlen(ts4)/4
),并将 DMA 引擎指向 CRC 数据寄存器。它给出了不同的 CRC 结果,~ 0xf2bd1910 0x0d42e6ef,所以我调用它,再次使用 HAL_CALCULATE 方法计算 WORD 大小(以确保 DMA 按预期工作)。这又给了 ~ 0xf2bd1910 0x0d42e6ef.
CRC32 算法是否会针对不同的字长输入给出不同的结果?我真的不想将 DMA 引擎绑定到传输字节上。是否有等效的“C”函数可以使用 32 位 WORD 输入计算 CRC32?我试过颠倒单词中字节的顺序,但这并没有解决问题(我认为这可能是一个 big/little 字节序问题)。
那是 51 个字符,而不是 52。超过 4 的长度将给出 12,而不是 13。前 48 个字符的 CRC 预计与 51 个字符的 CRC 不同。
此外,我认为您需要确保字符串从单词边界开始。
我使用的是 STM32 ARM CRC 外围设备,当以字节形式馈入时与以字形式馈入时相比,我为相同的数据获得不同的 CRC 代码。
使用字节字长和小字对齐的数据串:
const char *ts4 = "The quick brown fox jumped over the lazy brown dog."; // 52 CHARS divisible by 4;
缓冲区大小为 strlen(ts4)
的 CRC32 为 ~ 0x01fba559
0xfe045aa6.
然后将 CRC 配置为 WORD 大小(将缓冲区大小设置为 strlen(ts4)/4
),并将 DMA 引擎指向 CRC 数据寄存器。它给出了不同的 CRC 结果,~ 0xf2bd1910 0x0d42e6ef,所以我调用它,再次使用 HAL_CALCULATE 方法计算 WORD 大小(以确保 DMA 按预期工作)。这又给了 ~ 0xf2bd1910 0x0d42e6ef.
CRC32 算法是否会针对不同的字长输入给出不同的结果?我真的不想将 DMA 引擎绑定到传输字节上。是否有等效的“C”函数可以使用 32 位 WORD 输入计算 CRC32?我试过颠倒单词中字节的顺序,但这并没有解决问题(我认为这可能是一个 big/little 字节序问题)。
那是 51 个字符,而不是 52。超过 4 的长度将给出 12,而不是 13。前 48 个字符的 CRC 预计与 51 个字符的 CRC 不同。
此外,我认为您需要确保字符串从单词边界开始。