所以我使用SWIG从一些Java代码中调用一些C ++代码。我正在调用的函数接受一个字符串和一个整数。问题是,字符串似乎在两种语言之间发生了变化:
爪哇:
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编码解决。仍在SWIG中使用Java中的String和C ++中的字符串。
答案 0 :(得分:1)
您正在阅读的内容是二进制文件;尝试将数据转换为Java中的文本字符串没有意义。使用C ++,您不会遇到此问题,因为C ++中的string
没有字符编码,并且在读取和写入时不会应用任何转换,但是您会遇到另一个问题,因为数据可能包含字符串终止NUL字符。
在java中,您应该使用字节数组来保存二进制数据。在C ++中,您可能会使用char指针来动态分配内存。