Swift调用C++字符串加密函数出现乱码及EXC_BAD_ACCESS报错如何解决
问题根因
- 核心问题为C++加密函数的越界内存访问:你当前的循环终止条件仅判断了
i<100和str[i] != '\n',没有校验索引是否超出字符串本身的长度。std::string的终止标识是'\0'而非'\n',当传入的字符串不含换行符且长度小于100时,循环会继续读取字符串之后的非法内存区域,不仅会把垃圾值参与运算导致输出乱码,多次越界读写还会破坏内存结构,触发EXC_BAD_ACCESS崩溃。 - 次要问题是Objective-C封装层的编码不匹配:你从
NSString转std::string时用的是UTF8编码,但是转回来时用了[NSString defaultCStringEncoding],这个编码是随系统环境动态变化的,非固定UTF8,会额外引入乱码问题。 - 额外注意:原Objective-C方法定义末尾多了多余的分号,可能引发编译警告。
修复方案
首先修改C++加密函数的循环逻辑,增加字符串长度校验,避免越界访问:
string StringModifier::encryptString(string str) { int i; // 增加str.size()校验,避免越界 for(i=0; i < str.size() && i<100 && str[i] != '\n'; i++) { str[i] = str[i] + 2; } return str; }
然后修改Objective-C封装层的编码参数,统一用UTF8编码做转换:
// 如无特殊需求建议把stringModifier改成类成员变量,避免全局变量的潜在线程安全问题,单线程场景也可以保留全局定义 StringModifier stringModifier; -(NSString*)encryptString:(NSString*)str { string strng = [str UTF8String]; string finalString = stringModifier.encryptString(strng); // 替换为固定UTF8编码,避免编码不匹配 NSString *result = [NSString stringWithCString: finalString.c_str() encoding:NSUTF8StringEncoding]; return result; }
内容的提问来源于stack exchange,提问作者Can Yoldas
相关产品推荐
相关产品推荐

