使用 memcpy() 函数将 unsigned char 数组中的字节放入 std::string

Put bytes from unsigned char array to std::string using memcpy() function

我有 std::string 变量。我需要将一些字节从无符号字符数组中放入它。我知道第一个字节和长度。

我可以使用 std::string::assign 函数。我做到了。

但我想使用 memcpy 函数以正确的方式解决这个问题。

std::string newString;
memcpy(&newString, &bytes[startIndex], length);

我知道错了。我使用 std::vector.

进行了研究并发现了一些想法

请帮我找到这个问题最优雅的解决方案。

您需要设置字符串的大小,以便有一个适当大小的缓冲区来接收数据,并从您从 data()

获得的指针中转换常量
std::string newString;
newString.resize(length);
memcpy((char*)newString.data(), &bytes[startIndex], length);

当然,所有这些都属于未定义行为的范畴,但仍然非常标准。

这是一个 hack,正如你所说的错误方式,但这是可能的,因为 STL 保证 std::string 具有连续存储:

std::string str(32, '[=10=]');
std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY");

当然,你可以用同样的方式使用std::memcpy(我使用strcpy只是为了复制空终止字符串)...

你的情况:

str.resize(length);
memcpy(const_cast<char*>(str.data()), bytes + startIndex, length);

因为我们只是构造字符串,所以有一个 std::string 构造函数需要两个迭代器:

template< class InputIt >
basic_string( InputIt first, InputIt last, 
              const Allocator& alloc = Allocator() );

我们可以提供:

std::string newString(&bytes[startIndex], &bytes[startIndex] + length);

如果我们不构造字符串而是分配给现有字符串,您仍然应该更喜欢使用 assign()。这正是该功能的用途:

oldString.assign(&bytes[startIndex], &bytes[startIndex] + length);

但是如果你真的出于某种原因坚持memcpy(),那么你需要确保字符串实际上有足够的数据被复制到。然后使用 &str[0] 作为目标地址复制到其中:

oldString.resize(length); // make sure we have enough space!
memcpy(&oldString[0], &bytes[startIndex], length);

Pre-C++11 在技术上不能保证字符串连续存储在内存中,尽管实际上无论如何都是这样做的。