如何计算结构上的 crc16

How to compute a crc16 on a struct

我最近看了一些关于crc计算的论文和代码(例如A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS and the implementation in Linux)。据我了解,crc是从某个地址开始逐字节完成的。

示例来自 Linux 内核:

u16 crc16(u16 crc, u8 const *buffer, size_t len)
{
    while (len--)
    crc = crc16_byte(crc, *buffer++);
    return crc;
}

现在我问自己是否可以使用 struct 轻松做到这一点?

一般情况下不会,如果你想要一个合理的结果,不。

这是因为 CRC 应该在 "known" 字节序列上计算,内存中的结构是 而不是 已知字节序列。可以有用于对齐目的的填充字节,您不一定知道或无法控制,当然,不同的 systems/platforms 上的各个字段可以有不同的大小(struct 本身也可以)。 =15=]

如果您首先可以将结构序列化为具有已知且稳定映射的字节序列,那么您当然可以对该序列应用 CRC。 buffer 参数是 const u8 *,即指向常量字节的指针,而不是 const void *.

(巧妙地)暗示了这一点

如果您不在乎,并且不介意更改编译器设置 and/or 将程序移动到不同的系统,您可以使用:

const struct mystruct s = { ... };
const u16 crc = crc16(0, (u8 *) &s, sizeof s);

但是这个 在结构中包含任何填充,所以这是非常危险的。