2011-11-29 319 views
2

我的任務是實現基於J.G.的Checksum算法。弗萊徹校驗和ISO 8473-1:1998年,描述像這樣:基於J.G.的校驗和算法Fletcher

enter image description here

然後,他們的列表,可以進行檢查,看是否該算法中是正確的,但我的版本在最後兩個值失敗4個數據。
0000給人FFFF
0000'00的校驗提供了FFFF的校驗
ABCDEF'01給出9CF8
1456'F89A'0001校驗給人24DC

的校驗

我已經工作這幾個小時,並且找不到我做錯了什麼,一組新的眼睛可以幫助很大。

這裏是我的功能:

uint16 Crc_CalculateISOChecksum(uint8 *pt_start_address, uint32 length) 
{ 
    uint8 C0, C1; 
    uint8 data; 
    uint32 i; 
    uint8 ck1, ck2; 

    /* Initial value */ 
    C0 = 0; 
    C1 = 0; 

    /* memories - 32bits wide*/ 
    for (i=0; i<length; i++) /* nb_bytes has been verified */ 
    { 
     data = pt_start_address[i]; 
     C0 = (C0 + data)%255; 
     C1 = (C1 + C0)%255; 
    } 
    /* Calculate the intermediate ISO checksum value */ 
    ck1 = (unsigned char)(255-((C0+C1)%255)); 
    ck2 = (unsigned char)(C1%255); 
    if (ck1 == 0) 
    { 
     ck1 = MASK_BYTE_LSB; 
    } 
    if (ck2 == 0) 
    { 
     ck2 = MASK_BYTE_LSB; 
    } 
    return ((((uint16)ck1)<<8) | ((uint16)ck2));  
} 
+3

你說什麼是錯的...也許你也應該告訴我們,爲什麼你認爲,如果你想幫助... – Macmade

+1

你得到一個錯誤?它是什麼?或者是輸出錯誤?怎麼樣? – Kevin

+0

對不起,我猜這是不是很清楚我的問題是什麼。在問題描述中,有四個數據是根據他們應該生成的校驗和值給我的(0x0000 = 0xFFFF; 0x000000 = 0xFFFF; 0xABCDEF01 = 0x9CF8; 0x1456'F89A'0001 = 0x24DC)當我用我的函數嘗試它時,前兩個數據產生期望的校驗和,其他數據不給我期望值 – Leo

回答

1

你的中間和值應該是uint16_t(或UINT16在行話)。

uint16_t C0, C1; // Not uint8_t. 

根據您的系統上的哪些charint是(例如不要設想int有更多的位不是char)的中間和值可能會溢出。你的實現依賴於uint8_t被提升。

舉例說明:

0xFF    0xFF 
+0xFF    +0xFF 
=====    ===== 
0x1FE % 255 = 0  0xFE % 255 = 254 
    ^Retain   ^Drop 
-1

只是偶然發現了這一點。如果有人仍然感興趣:你在錯誤的方向上迭代。

不要從0迭代到長度1,而是從長度-1到0,然後它將工作。

for (i = length-1; i >= 0; i--) // and change i to 'signed' 
+0

爲什麼downvote? –

+0

[** Fletcher **](http://en.wikipedia .org/wiki/Fletcher%27s_checksum)校驗和是** pos銀行足球比賽相關的**。您必須從第一個(索引0)到最後一個(索引N-1)元素進行迭代。 –