最近、いくつかの論文とコードをcrc計算で読みました(例えば、A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMSとthe implementation in Linux)。私が理解する限り、crcは特定のアドレスからバイトごとに開始されます。 Linuxカーネルから構造体のcrc16を計算する方法
例:
u16 crc16(u16 crc, u8 const *buffer, size_t len)
{
while (len--)
crc = crc16_byte(crc, *buffer++);
return crc;
}
は、今私は自分自身を求めていますが、それは可能であるstruct
で簡単にこれを行うには?
ポインタを構造体にキャストできます: 'struct whatever x; –
CRCを同じクロスコンパイラ(少なくとも)に頼っているのであれば(例えばstruct padding)、 –
@ JohnnyMoppが答えを出しましたが、そこには欠陥があります。構造体にはコンパイラによって挿入されたパディングが含まれている可能性があります。パディングの値は不確定ですが、チェックサムの計算に使用されます。明示的に初期化する前に 'memset'を使って構造全体をゼロに設定することが推奨されます。それ以外の場合は、同じ構造の2つのチェックサムが異なることがあります。 –