在C++中将字符串转换为uint8_t数组

15

我想把一个std::string对象(如名称)转换成C++中的uint8_t数组。 reinterpret_cast<const uint8_t*> 函数拒绝我的字符串。由于我正在使用NS-3进行编码,某些警告被解释为错误。


3
展示你的代码。你所说的“string object”是什么意思?是指std::string还是指一个char指针? - selbie
3个回答

35

如果你想要一个指向该string数据的指针:

reinterpret_cast<const uint8_t*>(&myString[0])

如果你想要一个字符串的数据副本:

std::vector<uint8_t> myVector(myString.begin(), myString.end());
uint8_t *p = &myVector[0];

2
reinterpret_cast<const uint8_t*>(myString.c_str()) 可以正常工作(假设 myString 是一个 std::string)。 - fbrereto
3
std::vector 很好用。它可以在不使用 memcpy 或其他类 C 的代码的情况下,创建简单的副本。这种类型的问题往往会有其他复杂的解决方案,但是 std::vector 可以避免这些问题。 - rubenvb
2
@awoodland:虽然在C++03中它可能不是以null结尾的,但在C++11中,标准要求缓冲区必须以null结尾。 - David Rodríguez - dribeas
1
@Rob:我被告知C++03不需要它。然而,至少在C++11中我看到了它。§21.4.1 / 5 ...对于任何basic_string对象s,当0 <= n < s.size()时,&*(s.begin() + n) == &*s.begin() + n的标识应该成立。 - Mooing Duck
1
David:我知道它在幕后做了这件事,它只是隐藏了脆弱和不必要的细节,使代码更易读,并且此类操作的错误变得不存在。 - rubenvb
显示剩余8条评论

14

字符串对象有一个.c_str()成员函数,返回一个const char*指针。该指针可以转换为const uint8_t*

字符串对象具有.c_str()成员函数,返回一个const char *指针。这个指针可以强制转换为const uint8_t *

std::string name("sth");

const uint8_t* p = reinterpret_cast<const uint8_t*>(name.c_str());

请注意,只有在原始字符串对象未被修改或销毁的情况下,此指针才有效。


1
有没有一种方法可以反过来做呢?例如,我想将uint8_t数组转换为c_str。这可能吗? - Carlo

1
如果你需要一个实际的数组(不是指针,正如其他答案所建议的那样;这个区别在this answer中解释得非常好),你需要使用<algorithm>中的std::copy
std::string str = "foo";
uint8_t arr[32];
std::copy(str.begin(), str.end(), std::begin(arr));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接