所以我使用 SWIG 从一些 Java 代码调用一些 C++ 代码。我正在调用的函数接受一个字符串和一个整数。问题是,字符串似乎在两种语言之间发生了变化:
Java:
byte[] bytes = getBytesFromSomewhere();
String rv = new String(bytes, "ASCII");
logger.info(rv.substring(0,30));
f(rv, 10);
C++:
bool f(const string& data, const int num) {
LOG(ERROR) << "Got string: " << data.substr(0,30);
}
我的 Java 输出是:
GIF89a�Z��
我的 C++ 输出是:
GIF89a��Z����
什么给了?如何使两个字符串相同?
编辑:通过使用字节数组的 Base-64 编码解决。仍然在 Java 中使用 SWIG 和 String,在 C++ 中使用 string。
最佳答案
您正在读取的是一个二进制文件;尝试将数据转换为 Java 中的文本字符串没有意义。使用 C++ 你不会有这个问题,因为 C++ 中的 string
没有字符编码,并且在读写时没有应用转换,但是你会遇到另一个问题,因为数据可能包含字符串终止 NUL 字符。
在 Java 中,您应该使用字节数组来保存二进制数据。在 C++ 中,您可能会使用 char 指针来动态分配内存。
关于java - 使用 SWIG 的 Java 和 C++ 中的奇怪字符串行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169073/