c++ 如何读取从字符串的矢量转换而来的uint8_t数据?

uurity8g  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(211)

我需要使用函数func(uint8_t* buffer, uint size);假设我不能改变它的参数,我想给它一个字符串。
我有一个vector<string>,我必须将其转换为uint8_t*,然后读取它并将其转换回vector<string>。我尝试使用以下代码阅读(打印)vector.data()输出,但它打印的是垃圾:

#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

问题:
1.为什么这不管用
1.我在一些链接中看到,他们使用char*数组初始化std::string,如下所示:

char *ptr={'a'};
std::string myStr(ptr);

我想这是因为添加了“\0”,这是否与我的问题有关?

44u64gxh

44u64gxh1#

为什么这不管用
这是行不通的,因为std::string不仅仅是一个连续的内存块,它只包含字符串中的字符。
这里使用向量显然不是正确的方法。向量包含字符串的内容。只有std::string对象本身,它们不是字符串数据。
相反,您需要创建一个long的std::string

std::string foo {"foo"};
std::string bar {"bar "};
std::string baz {"bazaz"};

std::string complete = foo + bar + baz;

auto* whole_cstring = reinterpret_cast<uint8_t*>(complete.c_str());

// call your C-string-accepting function
func(whole_cstring, complete.length());

如果你确实有一个std::string s的std::vector作为开始,可以在一个简单的循环中完成连接:

std::vector<std::string> my_vector_of_strings; 
// insert strings into the vector
/// … ///

std::string complete;
for(const auto& individual_string : my_vector_of_strings) {
  complete += individual_string;
}

auto* whole_cstring = reinterpret_cast<uint8_t*>(complete.c_str());

// call your C-string-accepting function
func(whole_cstring, complete.length());

...缺少\0 ...我想这是因为添加了“\0”,这是否与我的问题有关?
不,那完全无关。

eyh26e7m

eyh26e7m2#

我有一个向量,必须转换为uint8_t*

std::vector<std::string> vec;

“转换”在C++(和其他语言)世界中有一个相对较强的定义。如果我理解你的意思,我建议如下:

#include <string>
#include <vector>
#include <algorithm>

int main(){
    std::vector<std::string> vec;
    // populate
    std::vector<uint8_t*> vec2(vec.size());
    std::transform(begin(vec), end(vec), begin(vec2), [](auto& s){ return reinterpret_cast<unsigned char*>(s.data()); });
}

或者,如果可能,您可以使用std::basic_string<uint8_t>而不是std::string(a/k/a std::basic_string<char>),以避免重新解释其内容。

相关问题