次のように記述されたメッセージのチェックサムを作成する手順があります。
チェックサムは、「メッセージ タイプ」ワードからメッセージ ブロックの最後までのすべてのバイトの 2 の補数の合計に等しい 1 バイトで構成されます (送信されたチェックサムを除く)。最上位ビットからのキャリーは無視されます。
私が見つけた別の説明は次のとおりです。 チェックサム値には、データ メッセージ内の他の単語 (つまり、メッセージ タイプ、メッセージ長、およびデータ ワード) のモジュロ 256 合計の 2 の補数が含まれます。受信機器は、受信した単語のモジュロ 256 和を計算し、この和を受信したチェックサム ワードに追加することができます。ゼロの結果は、通常、メッセージが正しく受信されたことを示します。
これは、メッセージ (チェックサムを除く) のすべてのバイトの値を合計し、この数値の modulo 256 を取得することを意味すると理解しています。この数値の 2 の補数を取得します。これが私のチェックサムです。
しかし、メッセージの例に問題があります(設計ドキュメントからのものなので、正しくエンコードされていると想定する必要があります)。
unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};
したがって、最後のバイト 0xE はチェックサムです。チェックサムを計算する私のコードは次のとおりです。
bool isMsgValid(unsigned char arr[], int len) {
int sum = 0;
for(int i = 0; i < (len-1); ++i) {
sum += arr[i];
}
//modulo 256 sum
sum %= 256;
char ch = sum;
//twos complement
unsigned char twoscompl = ~ch + 1;
return arr[len-1] == twoscompl;
}
int main(int argc, char* argv[])
{
unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};
int arrsize = sizeof(arr) / sizeof(arr[0]);
bool ret = isMsgValid(arr, arrsize);
return 0;
}
仕様はこちら:= http://www.sinet.bt.com/227v3p5.pdf
必要なアルゴリズムを誤解していると思います。このチェックサムを作成する方法はありますか?
Flippin 仕様の作成者は、データ例で間違いを犯しました。これを見つけてここに戻ってきて、他の人も見つけました。お時間を無駄にしてしまい申し訳ありません。私のコードを改善するための有用なコメントのように見えるので、私は応答を研究します。