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

尝试将 Java 字符截断为 1 个字节

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

C++ 程序使用平台的默认编码来表示char数据类型中的字符。要在 Java 中做同样的事情,您必须使用 Java 的等效byte数据类型,并在计算之前转换字符串:

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

如果这也不起作用,

  • 检查charC++ 程序中的符号:大多数编译器默认使用有符号字符,这与 Java 的字节一致。如果您使用无符号字符,则代码需要进行调整。
  • 首先检查 Java 程序是否正确读取字符串。一种方法是打印字节;鉴于красный您应该得到[-22, -16, -32, -15, -19, -5, -23]

    System.out.println(java.util.Arrays.toString(bytes));
    
于 2013-10-03T07:00:31.817 回答
0

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

给你一个byte[]ASCII 码数组,然后你可以像在 C++ 中一样操作。

于 2013-10-03T05:57:26.367 回答