如何实现vector<string>与uint8_t*互转及解决乱码问题
问题背景
现有函数func参数为uint8_t* buffer和uint size且无法修改,需传入字符串数据。尝试将vector<string>转为uint8_t*再转回时出现乱码,测试代码及输出如下:
测试代码
#include <cstdint> #include <string> #include <vector> #include <iostream> int main() { std::string a1 = {"ath"}; std::cout <<"1: "<< a1<<" end\n"; std::vector<std::string> vec; vec.push_back(a1); uint8_t *ptr = reinterpret_cast<uint8_t*>(vec.data()); std::cout <<"2: "<< ptr[0]<<" end\n"; }
输出结果
1: ath end 2: � end
疑问
- 为何此代码无法正常工作?
- 见过用
char*数组初始化std::string的写法:
猜测是自动添加char *ptr={'a'}; std::string myStr(ptr);'\0'生效,这是否和当前问题相关?
问题解答
1. 代码失效的核心原因
你完全搞错了vector<string>的底层存储逻辑:vec.data()返回的是指向std::string对象的指针,不是指向字符串内容的指针。
vector<string>里存的是一个个独立的std::string对象,每个std::string内部有自己的字符缓冲区指针、长度、容量这些数据。你把指向std::string对象的指针强转成uint8_t*后,ptr[0]取的是第一个std::string对象的第一个字节——这根本不是字符串里的'a',而是std::string对象内部的某个成员(比如缓冲区指针的低8位),自然会打印乱码。
要正确传递数据,你得先把所有字符串的内容拼接成连续的字节块,再把这个字节块的地址转成uint8_t*;反过来转回vector<string>时,还得提前记录每个字符串的长度,才能正确分割出每个字符串的内容。
2. 和char*初始化std::string写法的关系
两者没有任何关联,而且你看到的那个写法本身就是错误的:char *ptr={'a'};是非法代码,{'a'}是字符字面量,直接赋值给char*会把'a'的ASCII值(97)当成内存地址,访问这个地址基本会触发段错误。
std::string用const char*初始化时,要求传入的是以'\0'结尾的字符数组地址,它会从该地址读字符直到遇到'\0'。但你的问题是混淆了容器对象和字符串内容的存储,和'\0'自动添加完全没关系。
内容的提问来源于stack exchange,提问作者Atheel Massalha

