コンテキスト: 私の先生がDarwin-OP FrameworkをC++からJavaに移植しました。私のような学生がC++を習得することなく使用できます。 Darwinには2つのコントローラがあります:メインコントローラはLinuxを実行し、Javaコードを実行し、すべてのセンサ/サーボ/トランスデューサなどを制御するサブコントローラ(マイクロコントローラ)とシリアル接続します。このコードはどのようにしてチェックサムを検証しますか?
Darwinはmotion.bin 256ページのリストを格納するファイル。各ページは512(8 * 64)バイトで、7つのステップ(それぞれ64バイト)とページヘッダー(64バイト)で構成されています。各ステップには、サーボが取る位置(0〜4095の値)が含まれています。だからダーウィンが彼の腕を動かすために、彼は最後のステップを終えるまで(< 7)ステップを進んでいく。
ページヘッダーの内部に1バイトのチェックサムがあります。 Javaコードはチェックサムが計算され、検証されている2つのメソッドが含まれています
private static boolean VerifyChecksum(PAGE page) {
byte checksum = (byte)0x00;
byte[] pagebytes = page.GetBytes();
for (int i = 0; i < pagebytes.length; i++) {
checksum += pagebytes[i];
}
if (checksum != (byte)0xFF) {
return false;
}
return true;
}
private static void SetChecksum(PAGE page) {
byte checksum = (byte)0x00;
byte[] pagebytes = page.GetBytes();
page.header.checksum = (byte)0x00;
for (int i = 0; i < pagebytes.length; i++) {
checksum += pagebytes[i];
}
page.header.checksum = (byte)((byte)0xFF - checksum);
}
主な質問:誰かがチェックサムが検証される方法を説明することはできますか?私はなぜそれがchecksum != (byte)0xFF
をチェックするのか分からない。なぜ計算したchecksum
とpage.header.checksum
を比較してみませんか?
ボーナス質問:最初にファイルの整合性をチェックするのはなぜですか? .binファイル内のページが破損するのは一般的でしょうか?
に0の範囲内に常にあるそれはコメントしなかったため、一般的な方法でなければなりません...おかげ:) – user1534664
に私は、 XOR(ファイル)が0xFFになるには、合計が0x00でなければならないことを理解してください。しかし、私が理解していないことは、チェックサムが0x00であることをあなたがどのように知っているかです。あなたが検証でそれを使用しない場合は、なぜチェックサムをpage.headerに保存するのですか? – user1534664
@ user1534664それを抽出してチェックサムをやり直して比較するのではなく、あなたの教授はちょっとしたトリックを単純に利用しました。値がヘッダーにない場合、トリックは機能しないため、抽出せずにまだ使用されています。 –