上下文: 我的老師將Darwin-OP框架從C++移植到Java,允許像我這樣的學生使用它,而無需掌握C++。達爾文有兩個控制器:主控制器運行Linux並運行java代碼,並且與控制所有傳感器/伺服器/傳感器等的子控制器(微控制器)的串行連接。這段代碼如何驗證校驗和?
達爾文使用motion.bin在其中存儲256頁的列表的文件。每頁是512(8 * 64)字節,由7個步驟(每個64字節)加頁面標題(也是64字節)組成。每個步驟都包含伺服所需的位置(介於0-4095之間的值)。因此,爲達爾文移動他的胳膊,他會經歷(< 7)的步驟數量,直到他完成最後一步。
在頁眉中有一個字節的校驗和。 Java代碼包含在校驗和計算和驗證兩種方法:
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文件中的頁面是否會被破壞?
必須是一種常見的做法的範圍內,因爲它是不評論...謝謝:) – user1534664
我理解XOR(文件)必須爲0x00才能變爲0xFF。但是,我不明白的是你如何知道校驗和事先是0x00。爲什麼即使您不打算在驗證中使用它,甚至還會將校驗和存儲在page.header中? – user1534664
@ user1534664而不是提取它並重新校驗和比較,你的教授只是利用了一點小技巧。它仍在使用而沒有提取,因爲如果該值不在標題中,該技巧將不起作用。 –