如何计算结构上的 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);
但是这个 将 在结构中包含任何填充,所以这是非常危险的。
我最近看了一些关于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);
但是这个 将 在结构中包含任何填充,所以这是非常危险的。