2009-12-27 110 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(); 

}