2009-12-27 53 views
1

這看起來是否正確?我試圖將這個校驗和方法從C移植到Java,但是從我的Java函數返回的值太高。我懷疑我欺騙unsigned int的方式不正確?C到Java端口:計算3個字節的校驗和

char *Generate(char * buffer, long length) { 

    static char tBuf[4]; 
    long index; 
    unsigned int checksum; 

    for(index = 0L, checksum = 0; index < length; checksum += (unsigned int) buffer[index++]); 
    sprintf(tBuf, "%03d", (unsigned int) (checksum % 256)); 
    return(tBuf); 

} 

我的Java接口:

public String generateCheckSum(String value) {   

    char[] chars = value.toCharArray();   
    long checksum = 0L; 

    for(int i = 0; i < chars.length; i++) {     
     checksum += (checksum + (long) chars[ i ]) & 0xFF; 
    } 

    return String.valueOf(checksum % 256); 
} 

任何有識之士非常感謝,感謝

+0

只需要注意一點:Java中的字符串不是*字節數組。它是* chars *的數組,它們是單獨的UTF-16 *代碼單元*。如果你需要一個字節數組的校驗和,那麼使用字節而不是字符。我的Java代碼是: 校驗和=(校驗和+(長)字符[i])&0xFF我的部分在這個問題上是錯別字,我的Java代碼是: – Joey 2009-12-27 05:31:14

回答

3

C++

checksum += (unsigned int) buffer[index++] 

的Java

checksum += (checksum + (long) chars[ i ]) & 0xFF 

那裏面有

+0

校驗和= – Pythonicus 2009-12-27 05:38:06

0

一個額外的校驗,你不覺得在Java代碼中

checksum += (checksum + (long) chars[ i ]) & 0xFF; 

應該

checksum += ((long) chars[ i ]) & 0xFF; 

同樣在你的C函數中,你使用了不正確的格式說明符unsigned int。它應該是%u而不是%d

0

一個較短的版本

public String generateCheckSum(String value) {   
    int checksum = 0; 
    for(char ch : value.toCharArray()) checksum += ch; 
    return "" + (checksum & 0xFF); 
} 

注:校驗和256%和校驗& 0xFF的不這樣做同樣的事情。第一個是簽名,可以返回否定結果,第二個不會。

0

謝謝你的所有反饋,它讓我得到我的最終解決方案。我相信它可以進一步調整,但它確實產生了所需的校驗和值。

public Integer generateCheckSum(String value) throws UnsupportedEncodingException { 

    byte[] data = value.getBytes("US-ASCII");   
    long checksum = 0L; 

    for(byte b : data) { 
     checksum += b; 
    } 

    checksum = checksum % 256; 

    return new Long(checksum).intValue(); 

}