我们在将逻辑从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代码中获得相同的值。
答案 0 :(得分:1)
尝试将Java字符截断为1个字节
sum += (0xFF & keyValue.charAt(i)) * 11;
答案 1 :(得分:1)
C ++程序使用平台的默认编码来表示char
数据类型中的字符。要在Java中执行相同操作,您必须使用Java的等效byte
数据类型,并在计算之前转换字符串:
byte[] bytes = keyValue.getBytes();
for (byte b: bytes) sum += 11*b;
如果这也不起作用,
char
的符号:大多数编译器默认使用带符号的字符,这与Java的字节一致。如果使用无符号字符,代码需要进行调整。检查Java程序是否正在正确读取字符串。一种方法是打印字节;给定красный
,您应该获得[-22, -16, -32, -15, -19, -5, -23]
:
System.out.println(java.util.Arrays.toString(bytes));
答案 2 :(得分:0)
Charset.forName("US-ASCII").encode(keyValue).toArray()
为您提供byte[]
ASCII代码数组,然后您可以像在C ++中一样操作。