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

すべてのフィードバックに感謝します、それは私が私の最終的な解決策にたどり着くのを許しました。さらに微調整できると確信していますが、目的のチェックサム値が生成されます。

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 に答える
0

短いバージョン

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

注:チェックサム%256とチェックサム&0xFFは同じことをしません。最初のものは署名されており、否定的な結果を返す可能性がありますが、2番目のものはそうではありません。

于 2009-12-27T09:34:59.363 に答える
0

Javaコードで考えていませんか

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

する必要があります

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

?

また、C 関数で、 に対して不適切な書式指定子を使用していますunsigned int%uの代わりにする必要があり%dます。

于 2009-12-27T05:37:27.093 に答える