使用memcpy()函数将字节从无符号字符数组放入std :: string中

问题描述 投票:11回答:3

我有std :: string变量。我需要将未签名字符数组中的一些字节放入其中。我知道第一个字节和第一个字节。

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

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

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

我知道这是错误的。我已经研究并使用std :: vector找到了一些想法。

[请帮助我找到解决此问题的最佳方法。

c++ stl memcpy unsigned-char
3个回答
19
投票

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

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]

C ++ 11以前的版本在技术上不能保证将字符串连续存储在内存中,尽管实际上还是可以做到这一点。


-1
投票

您需要设置字符串的大小,以便将有适当大小的缓冲区来接收数据,并将常量从您从if (length > 0) // Avoids accessing oldString[0] if empty { oldString.resize(length); // make sure we have enough space! memcpy(&oldString[0], &bytes[startIndex], length); } 获得的指针中强制转换为常量

data()

当然,所有这些都是未定义行为的领域,但相当标准的行为却并非如此。


-3
投票

这是一个hack,正如您所说的那样,但是由于STL保证std::string newString; newString.resize(length); memcpy((char*)newString.data(), &bytes[startIndex], length); 具有连续的存储,所以有可能:

std::string

当然,您可以以相同的方式使用std::string str(32, '\0'); std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY"); (我仅使用std::memcpy复制以空值结尾的字符串)...

根据您的情况:

strcpy
© www.soinside.com 2019 - 2024. All rights reserved.