以有效的方式将 C 字符串转换为 std::vector<byte>

Posted

技术标签:

【中文标题】以有效的方式将 C 字符串转换为 std::vector<byte>【英文标题】:Converting a C-string to a std::vector<byte> in an efficient way 【发布时间】:2009-10-16 18:04:02 【问题描述】:

我想将 C 风格的字符串转换为字节向量。 一个可行的解决方案是手动转换每个字符并将其推送到向量上。但是,我对这个解决方案并不满意,想找到一种更优雅的方式。

我的尝试之一如下:

std::vector<byte> myVector;
&myVector[0] = (byte)"MyString";

哪些错误让我得到了一个

错误 C2106:'=':左操作数必须是左值

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

最基本的东西是这样的:

const char *cstr = "bla"
std::vector<char> vec(cstr, cstr + strlen(cstr));

当然,知道长度就不用计算了。

更常见的解决方案是使用std::string 类:

const char *cstr;
std::string str = cstr;

【讨论】:

必须使用 std::vetor 以某种二进制格式存储它。【参考方案2】:

vector 等 STL 容器总是拥有所有权,即它们管理自己的内存。您不能修改由 STL 容器内部管理的内存。因此,您的尝试(以及任何类似的尝试)注定要失败。

唯一有效的解决方案是复制内存或编写一个新的 STL 样式容器,该容器不获取它所访问的内存的所有权。

【讨论】:

您不能强制 STL 容器使用您分配的存储空间,不。但是您可以通过vector::resize()vector::reserve() 修改容器的存储:) allocator_traits 呢?即,如果您制作自定义 allocator_traits 并分配给向量? @Konrad Rudolph - 我有类似的情况,我从 argv 收到几个 C 风格的字符串(用空格分隔),我希望将它们“连接”成一个向量,即 -对于输入:./MyExe AA BB CC DD - 我希望矢量 vec 如下所示:vec = A,A,B,B,C,C,D,D。目前,我的代码首先从给定的输入字符串构造一个 std::string ,然后将其转换为 vector (见下文)。有没有更有效的方法来做到这一点? int main(int argc, char** argv) string inputStr; for (int i = 1; i 【参考方案3】:

如果您不想复制原始字符串,而只想将其作为字节数组进行迭代,那么 C++20 可以提供 std::span

auto const const_bytes = std::as_bytes(std::spanstr.data(), str.size());

std::span&lt;const std::byte&gt; 提供 std::vector 之类的迭代功能,我认为这正是您可能需要的。

注意:原始字符串必须在 std::span 变量的整个范围内保持有效

【讨论】:

【参考方案4】:

按照这些思路应该可以工作

 std::vector<byte> myVector = std::vector((byte*)cstring, (byte*)ctring + strlen(cstring))

此外,这仍然只是遍历 c 字符串并将值插入向量中。正如 Konrad 所说,这就是你必须这样做的方式,因为向量管理它们自己的内存。

【讨论】:

【参考方案5】:
std::vector<byte> myVector;
const char* str = "MyString";
myVector.assign( str, str+strlen(str) );

【讨论】:

【参考方案6】:

最明显的问题是为什么你不只使用 std::string:

std::string myString("MyString");

但如果你真的认为你需要一个向量:

char myString[] = "MyString";

std::vector<byte> myVector(myString, myString+sizeof(myString));

您可能还想考虑使用 std::tr1::array:

std::tr1::array<byte, sizeof("MyString")> myArray = "MyString";

C++ 0x 也会有std::array

【讨论】:

对我来说一个更明显的问题是:他首先从哪里获得 char 数组(除非某些库函数分配并返回它)?【参考方案7】:
const char *cstr = "bla"
std::vector<char> vec;
vec.resize(strlen(cstr)+1);
strcpy(&vec[0],cstr);

【讨论】:

以上是关于以有效的方式将 C 字符串转换为 std::vector<byte>的主要内容,如果未能解决你的问题,请参考以下文章

在C中有效地将十六进制字符串转换为整数?

c语言中怎么把两个已经以字符串方式存起来的时间相减,得到时间差

将 char 数组转换为 uint16_t 数组 C/C++

将“ff0000”之类的字符串转换为目标c中的十六进制数

如何将单个字符转换为字符串?

Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为日期时间