2016-04-30 9 views
1

コンテキスト: 私の先生が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をチェックするのか分からない。なぜ計算したchecksumpage.header.checksumを比較してみませんか?

ボーナス質問:最初にファイルの整合性をチェックするのはなぜですか? .binファイル内のページが破損するのは一般的でしょうか?

答えて

2

チェックサムを計算するには、ファイル内のすべてのバイトのXORを実行し、その値から0xFFを差し引いた値を返します。
チェックサムメソッドに渡されるファイルは、チェックサム位置に0x00の最後のファイルです。バイナリの場合

sum = 0xFF - XOR(file) 

、さらにはXOR、したがってラインchecksum += pagebytes[i];

ご教授の検証方法と同じであり、ファイル全体をXORします。つまり、チェックサムメソッドの元の引数と、チェックサムメソッドの出力である追加のバイトです。

だから、期待される結果は次のようになります。ヘッダーと仮定すると

XOR(file, sum) 
= XOR(file) + sum 
= XOR(file) + 0xFF - XOR(file) 
= 0xFF 
+0

に0の範囲内に常にあるそれはコメントしなかったため、一般的な方法でなければなりません...おかげ:) – user1534664

+0

に私は、 XOR(ファイル)が0xFFになるには、合計が0x00でなければならないことを理解してください。しかし、私が理解していないことは、チェックサムが0x00であることをあなたがどのように知っているかです。あなたが検証でそれを使用しない場合は、なぜチェックサムをpage.headerに保存するのですか? – user1534664

+0

@ user1534664それを抽出してチェックサムをやり直して比較するのではなく、あなたの教授はちょっとしたトリックを単純に利用しました。値がヘッダーにない場合、トリックは機能しないため、抽出せずにまだ使用されています。 –

0

は、ページの一部です。次に、すべてのバイトxの合計を計算し、チェックサムとして255-xを格納します。それを検証するとき、y + 255 - xは255に等しくなければなりません。xとyが同じ数です。

すべての計算が実行モジュロ256であることに注意してください、したがって、xとyは255

関連する問題