0

以下のロジックを C++ から Java に移植する際に問題があります。Java メソッドは、C++ 関数と同じ値を返す必要があります。keyValue に非 ASCII 文字が含まれている場合、ロジックは失敗します。

C++ 関数は次のようになります。

   int CMyClass::KeyToId( const char *keyValue ) {

    int sum = 0, len = strlen( keyValue );

       // Get a sum based on the characters in the string.
       // Each character contributes + <ASCII-value> * 11.
       for( int i = 0; i < len; i++ )   sum += keyValue[i] * 11;
       // Modulo the result to get a value in the standard range.
       return sum;  
   }

2 行目では、keyValue[i] を 8 バイトの ASCII コードに変換しています。

Java への正確なポートは次のようになります。

private int keyToId(String keyValue) {
     int sum = 0, len =  keyValue.length();

        // Get a sum based on the characters in the string.
        // Each character contributes + <ASCII-value> * 11.

        for( int i = 0; i < len; i++ )   
            sum += keyValue.charAt(i) * 11;
    return sum;
}

Java では、文字 keyValue.charAt(i) は「unicode」値に変換されます。これを同等の ASCII コードに変換する簡単な方法がわかりませんでした。C++ アプリは非 Unicode アプリケーションです。C++ ロジックを変更することはできません。

その他の入力: ロシア語でアプリを実行しています。красный の入力の場合、C++ アプリは -1452 を返します。Java コードから同じ値を取得したいと思います。

4

3 に答える 3

1

charC++ プログラムは、プラットフォームのデフォルトのエンコーディングを使用して、データ型の文字を表します。Java で同じことを行うには、Java の同等のbyteデータ型を使用し、計算の前に文字列を変換する必要があります。

byte[] bytes = keyValue.getBytes();
for (byte b: bytes) sum += 11*b;

それもうまくいかない場合は、

  • C++ プログラムの符号を確認してcharください。ほとんどのコンパイラはデフォルトで符号付き文字を使用します。これは Java のバイトと一致します。unsigned char を使用する場合、コードを調整する必要があります。
  • まず、Java プログラムがストリングを正しく読み取っていることを確認してください。これを行う 1 つの方法は、バイトを出力することです。красныйあなたが取得する必要があります[-22, -16, -32, -15, -19, -5, -23]

    System.out.println(java.util.Arrays.toString(bytes));
    
于 2013-10-03T07:00:31.817 に答える
1

Java 文字を 1 バイトに切り詰めてみてください

 sum += (0xFF & keyValue.charAt(i)) * 11;
于 2013-10-03T05:31:42.127 に答える
0

Charset.forName("US-ASCII").encode(keyValue).toArray()

ASCII コードのbyte[]配列を提供し、その後は C++ と同じように操作できます。

于 2013-10-03T05:57:26.367 に答える