2016-04-30 31 views
1

上下文: 我的老師將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。爲什麼不直接比較計算的checksumpage.header.checksum

獎勵問題:爲什麼首先檢查文件的完整性? .bin文件中的頁面是否會被破壞?

回答

2

要計算校驗和,您執行文件中所有字節的XOR,然後返回0xFF減去該值。
傳入校驗和方法的文件是校驗和位置中帶有0x00的最終文件。

sum = 0xFF - XOR(file) 

對於二進制,除了是一樣的XOR,因此線checksum += pagebytes[i];

你教授的驗證方法,將異或整個文件。也就是說,校驗和方法的原始參數,以及作爲校驗和方法輸出的附加字節。

因此,預期的結果則是:

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

必須是一種常見的做法的範圍內,因爲它是不評論...謝謝:) – user1534664

+0

我理解XOR(文件)必須爲0x00才能變爲0xFF。但是,我不明白的是你如何知道校驗和事先是0x00。爲什麼即使您不打算在驗證中使用它,甚至還會將校驗和存儲在page.header中? – user1534664

+0

@ user1534664而不是提取它並重新校驗和比較,你的教授只是利用了一點小技巧。它仍在使用而沒有提取,因爲如果該值不在標題中,該技巧將不起作用。 –

0

假設標題是頁面的一部分。然後計算所有字節x的總和,並存儲255-x作爲校驗和。驗證時,計算y + 255 - x必須等於255.如果是,則x和y是相同的數字。

注意,所有的計算都進行模256,因此x和y總是在0到255