java - 使用 SWIG 的 Java 和 C++ 中的奇怪字符串行为

标签 java c++ string swig

所以我使用 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/

相关文章:

java - 如果我将单例类用于数据库连接,一个用户可以为所有人关闭连接吗?

java - list 文件中的类名和包名

java - HTTP 状态 500 - java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'myUser' available as request attribute

java - getTouchMajor() 不精确 : I can not get real value about the touch area length

c++ - 将变量的引用传递给模板

ios - 将字符替换为 url 可接受的格式 [iOS/SWIFT]

c - 了解声明 C 字符串的两种方式

c++ - C++ `new` 运算符可以在现实生活中抛出异常吗?

c++ - 游戏编程库C++

Java:如何使用类似日志记录的模式格式化字符串?