私の質問の簡単な背景: 私は、UART 経由で PC と通信するマイクロコントローラーを使用した小さな趣味のプロジェクトに取り組んでいます。現在、0x00 パケット区切りバイトと、2 の補数の合計または 1 の補数の合計である単純な 1 バイトのチェックサムを使用した COBS バイト スタッフィングを使用しています。私の補数チェックサムの実装は、インターネットのチェックサムと非常によく似ています(7 ページ。興味深い部分を以下に示します)。
// Fold 32-bit sum to 16 bits //
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
checksum = ~sum;
数日前、私は Fletcher チェックサムについて知りました:
Fletcher の記事
Fletcher の実装
Fletcher Wikipedia
Fletcher Wiki ページからの短いコード スニペット:
for( index = 0; index < count; ++index )
{
sum1 = (sum1 + data[index]) % 255;
sum2 = (sum2 + sum1) % 255;
}
return (sum2 << 8) | sum1;
私の質問:上記の両方の記事で、フレッチャーは「1 の補数 [mod(255)] チェックサム」を mod-255 と 1 の補数の合計が同じであるかのように使用していると述べています。それは本当に本当ですか?
- 1 の補数チェックサムを優れたものにするキャリー ビットが、上記の 1 の補数加算器と比較して mod-255 の合計でほぼ同じように機能することは、私には理にかなっています。しかし、mod-255 の合計では、値 0xFF (-0) を取得することはできず、0x00 (+0) のみを取得できますか?
- mod-operatorの方が遅いと思います(ただし、線形であるため、合計が終了するまでmod計算を待つことができます)。
- (COBS を使用する場合の) 優れた機能は、mod-255 の合計が 0xFF になることはあり得ないため、mod-255 が 0x00 チェック バイトを生成しないことです (ただし、上記の 1 の補数加算器でも簡単に修正できます)。
お時間をいただきありがとうございました!
敬具/ヘンリック