今天,我嘗試將 xor 加密 java 代碼轉換為 c++ 但不起作用并輸出錯誤,也許我錯了,java 代碼:public static String encryptDecryptStr(String str) { String key = "ABCDEF"; final int l0 = key.length() - 1; int l1 = key.length() - 1; final char[] strRemp = new char[str.length()]; char opcode = 85;; for (int i = strRemp.length - 1; i >= 0; i--) { strRemp[i] = (char) (str.charAt(i) ^ opcode ^ key.charAt(l1)); opcode = (char) ((char) (opcode ^ i ^ key.charAt(l1)) & 63); --l1; if (l1 < 0) l1 = l0; } return new String(strRemp);}我嘗試 C++ 代碼:JNIEXPORT jstring JNICALL Java_com_test_app_Utils_encryptDecryptStr(JNIEnv *env, jobject, jstring inStr){std::string in = env->GetStringUTFChars(inStr, NULL);std::string key = "ABCDEF";int l0 = static_cast<int>(key.size() - 1);int l1 = static_cast<int>(key.size() - 1);char *strRemp = new char[in.size()];char opcode = 85;for (int i = static_cast<int>(strlen(strRemp) - 1); i >= 0; i--) { strRemp[i] = in[i] ^ opcode ^ key[l1]; opcode = static_cast<char >(static_cast<char >(opcode ^ i ^ key[l1]) & 63); --l1; if (l1 < 0) l1 = l0;}return (jstring)env->NewStringUTF(strRemp);}我測試:com.test.app.Utils.encryptDecryptStr(encryptDecryptStr("Hello World"));測試二:encryptDecryptStr(com.test.app.Utils.encryptDecryptStr("Hello World"));有人可以幫助我嗎?
1 回答

達令說
TA貢獻1821條經驗 獲得超6個贊
Java 和 C++ 是不同的語言。
char
在 Java 和char
C++ 中是兩種不同的類型。
在 Java 中,您正在使用 2 字節的 UTF-16 編碼字符。在 C++ 中,您使用的是 1 字節字符,但它們實際上是多字節 UTF-8 編碼的。您必須確保使用相同的二進制數據。
int i = static_cast<int>(strlen(strRemp) - 1)
這是未定義的行為,因為您沒有正確地 0-terminatedstrRemp
。你應該in.size()
改用。std::string in = env->GetStringUTFChars(inStr, NULL);
這會造成內存泄漏,因為std::string
構造函數從 返回的 char* 數組中復制數據GetStringUTFChars
,但該數組本身永遠不會被釋放。你
delete[] strRemp
最后沒有,另一個內存泄漏。您不應該使用
strings
此類二進制數據,因為字符串函數會將所有字節解析為他們認為字符串具有的任何編碼的字符,最好的情況是使您的代碼中斷,或者最壞的情況是引入嚴重的安全問題。而是使用原始二進制數據數組。
添加回答
舉報
0/150
提交
取消