我们在将以下逻辑从 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 代码中获得相同的值。
最佳答案
C++ 程序使用平台的默认编码来表示 char
数据类型中的字符。要在 Java 中执行相同操作,您必须使用 Java 的等效 byte
数据类型,并在计算之前转换字符串:
byte[] bytes = keyValue.getBytes();
for (byte b: bytes) sum += 11*b;
如果还是不行,
- 检查C++程序中
char
的符号:大多数编译器默认使用signed chars,这与Java的byte不谋而合。如果您使用无符号字符,则代码需要调整。 首先检查 Java 程序是否正确读取字符串。一种方法是打印字节;给定
красный
你应该得到[-22, -16, -32, -15, -19, -5, -23]
:System.out.println(java.util.Arrays.toString(bytes));
关于java - Java中unicode字符的ASCII码等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151383/