私はプログラマーであり、マシンにデータを送信する必要がありますが、データの最後にチェックサムを追加する必要があります。誰かがそれを行う方法の例を教えてもらえますか?そうすれば、チェックサムを計算するプログラムを書くことができます。

ルール:最上位アドレスバイトで始まる1バイトの合計バイトのビット単位の反転チェックサムの前のバイトで終わります。 (ビット単位の反転を実行するには、FF16進数で1バイトの合計を「排他的論理和」します。)

ありがとう

コメント

  • これはタグと何の関係がありますか:power-electronics?

回答

定義はかなりうまくいっています

最上位アドレスバイトで始まり、チェックサムの前のバイトで終わる1バイトの合計バイトのビット単位の反転。 (ビット単位の反転を実行するには、FF 16進数で1バイトの合計を「排他的論理和」します。)

  • メッセージ “Hello” = Hex:48 65 6C 6C6F。
  • プログラマーモードでWindowsCalc.exeを使用してこれらを合計すると、& h01F4になります。
  • 最後のバイトを取り、他のすべてを無視します:& hF4。
  • & hF4 XOR & hFF = & h0B-チェックサム。

最後のビットを明確にするには:

&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B 

更新

何らかの理由で、機能しません。ここにCA00 01 70 00があり、それらを合計して13Bを取得し、最後のバイトである3BとFFとのXORを取得し、8Eとは異なるc4を取得します(マニュアルから取得した例)。ルールについて何か見落としがありますか?

ルールをWeb検索すると、からドキュメントがスローされました。 NESLAB 。 B-2ページで次のように読みます:

ここに画像の説明を入力してください

図1.チェックサム領域はチェックサムで使用される唯一の部分です。

これはあなたの混乱を説明するはずです。主人公は計算に含まれません。ここで、CA 00 01 70 00でチェックを実行すると、CAを削除でき、いくつかのゼロ、01と70が残り、合計は& h71になります。

& h71 XOR & FF = & h8E。出来上がり!

コメント

  • ありがとうございます。 "バイトの合計1バイトのビット単位の反転"について混乱しました。最後のバイトを取ることを意味するのかわかりませんでしたが、あなたはそれをクリアしました。どうもありがとうございました!!
  • 好奇心が強いのですが、なぜXORとh ' FFがあるのですか? 'これは、各ビットを反転するのと同じではありません(0- > 1、1- > 0)。どちらも私には同じことをしているようです。次に、それを"メッセージ内のすべてのバイトの合計のビット単位で反転された最終バイトとして表すことができます"
  • はい、あなたは正しいですが、XORは1つの命令のみを使用して8ビットすべてを反転します。 'これ以上効率的な方法は考えられません。できますか?
  • 何らかの理由で、うまくいきません。ここにCA00 01 70 00があり、それらを合計して13Bを取得し、最後のバイトである3BとFFとのXORを取得し、8Eとは異なるc4を取得します(マニュアルから取得した例)。ルールについて何か見落としがありますか?
  • @transistor:明確にしていただきありがとうございます。ええと、私は'プログラミング言語を知りません、それは私にとってそのようにもっと理にかなっています。私はperlでそれが'ただ〜変数であることを知っています。実際には、'どちらの方法でも違いはないと思います

回答

必要なチェックサムは次のようにデータに基づいて計算されます:

ここに画像の説明を入力してください

チェックサムに主人公0xCAを含めない、影付きのみバイト。

例を計算するための簡単なCコード:

int main() { int i; unsigned char cs; unsigned char a[] = {0x00, 0x01, 0x70, 0x00}; cs=0; for (i=0; i< sizeof(a); i++) { cs += a[i]; } cs ^=0xFF; printf("cs = %X \n", cs); return 0; } 

結果は期待どおりです:

sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E 

変数csを符号なし文字として宣言したので、加算するたびに上位ビットが破棄されます。追加は他の例とまったく同じです。手動で行う場合は、最後に上位ビットを破棄できます。これらの場合、チェックサムに含まれるものと含まれないものを正確に注意してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です