如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?
Posted
技术标签:
【中文标题】如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?【英文标题】:How to convert std::string to std::vector<std::byte> in C++17? 【发布时间】:2018-10-08 09:40:32 【问题描述】:如何在 C++17 中将 std::string
转换为 std::vector<std::byte>
?
已编辑:由于尽可能多地检索数据,我正在填充异步缓冲区。所以,我在缓冲区上使用std::vector<std::byte>
,我想转换字符串来填充它。
std::string gpsValue;
gpsValue = "time[.........";
std::vector<std::byte> gpsValueArray(gpsValue.size() + 1);
std::copy(gpsValue.begin(), gpsValue.end(), gpsValueArray.begin());
但我收到此错误:
error: cannot convert ‘char’ to ‘std::byte’ in assignment
*__result = *__first;
~~~~~~~~~~^~~~~~~~~~
【问题讨论】:
你为什么要这样做? 我在描述中添加了原因 使用 std::transform? How to use new std::byte type in places where old-style unsigned char is needed?的可能重复 相关,见How to convert std::string to std::vector<uint8_t>?,std::move between std::string and std::vector<unsigned char>(和朋友)。 【参考方案1】:使用std::transform
应该可以:
#include <algorithm>
#include <cstddef>
#include <iostream>
#include <vector>
int main()
std::string gpsValue;
gpsValue = "time[.........";
std::vector<std::byte> gpsValueArray(gpsValue.size() + 1);
std::transform(gpsValue.begin(), gpsValue.end(), gpsValueArray.begin(),
[] (char c) return std::byte(c); );
for (std::byte b : gpsValueArray)
std::cout << int(b) << std::endl;
return 0;
输出:
116
105
109
101
91
46
46
46
46
46
46
46
46
46
0
【讨论】:
【参考方案2】:std::byte
不应该是一个通用的 8 位整数,它只应该代表一个原始二进制数据的 blob。因此,它确实(正确地)不支持来自char
的分配。
您可以改用std::vector<char>
- 但这基本上就是std::string
的含义。
如果您确实想将字符串转换为 std::byte
实例的向量,请考虑使用 std::transform
或 range-for
循环来执行转换。
【讨论】:
这很奇怪,byte
的大小应该和char
一样,不管它包含多少位。
@liliscent float
s 通常与int
s 大小相同(32 位),并不意味着可以对简单的赋值进行逐位复制。
@DanM。你错过了我的观点。我的评论是说答案中的解释,特别是提到 8 位,并不能证明不存在从 char
到 byte
的分配。 IMO,应该定义赋值运算符。
@liliscent 好像你没有抓住重点。 std::byte
不是字符类型,也不是算术类型。它专门用于表示内存位。进行任意隐式转换会破坏它的用途并将其降级为只是 unsigned char 的 typedef,但事实并非如此。以上是关于如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中将 std::string 转换为 const char [重复]
在c ++ 11中将std :: string转换为char * [重复]