使用 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 在技术上不能保证字符串连续存储在内存中,尽管实际上无论如何都是这样做的。
我有 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 在技术上不能保证字符串连续存储在内存中,尽管实际上无论如何都是这样做的。