2013-10-03 82 views
0

所以我使用SWIG從一些Java代碼中調用了一些C++代碼。我正在調用的函數需要一個字符串和一個整數。問題是,該字符串似乎這兩種語言之間切換:使用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中使用帶有String的SWIG,並在C++中使用字符串。

+0

只是猜測,但你的字符串似乎不是正確的零終止。字節數組是否轉換爲std :: string? – pag3faul7

回答

1

你正在閱讀的是一個二進制文件;嘗試將數據轉換爲Java中的文本字符串沒有任何意義。使用C++,你不會遇到這個問題,因爲C++中的string沒有字符編碼,並且在讀寫時沒有應用轉換,但是你會遇到另一個問題,因爲數據可能包含終止NUL字符的字符串。

在java中,你應該使用一個字節數組來保存二進制數據。在C++中,您可能會使用char指針來動態分配內存。

+0

如何從Java到C++獲取數據? – forefinger

+0

我對swig不熟悉;你有什麼選擇傳遞字節數組? – Joni