1

这看起来正确吗?我正在尝试将此校验和方法从 C 移植到 Java,但从我的 Java 函数返回的值太高。我怀疑我捏造 unsigned int 的方式不正确?

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 );
}

非常感谢任何见解,谢谢

4

4 回答 4

3

C++

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

爪哇

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

里面有一个额外的校验和

于 2009-12-27T05:31:09.117 回答
0

你不会在你的 Java 代码中思考

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

应该

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

?

同样在您的 C 函数中,您对unsigned int. 它应该%u代替%d.

于 2009-12-27T05:37:27.093 回答
0

较短的版本

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

注意:校验和 % 256 和校验和 & 0xFF 不做同样的事情。第一个已签名并且可以返回否定结果,第二个不会。

于 2009-12-27T09:34:59.363 回答
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();

}
于 2010-01-07T05:16:55.527 回答