如何在 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&lt;std::byte&gt;已编辑:由于尽可能多地检索数据,我正在填充异步缓冲区。所以,我在缓冲区上使用std::vector&lt;std::byte&gt;,我想转换字符串来填充它。

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&lt;char&gt; - 但这基本上就是std::string 的含义。


如果您确实想将字符串转换为 std::byte 实例的向量,请考虑使用 std::transform 或 range-for 循环来执行转换。

【讨论】:

这很奇怪,byte 的大小应该和char 一样,不管它包含多少位。 @liliscent floats 通常与ints 大小相同(32 位),并不意味着可以对简单的赋值进行逐位复制。 @DanM。你错过了我的观点。我的评论是说答案中的解释,特别是提到 8 位,并不能证明不存在从 charbyte 的分配。 IMO,应该定义赋值运算符 @liliscent 好像你没有抓住重点。 std::byte 不是字符类型,也不是算术类型。它专门用于表示内存位。进行任意隐式转换会破坏它的用途并将其降级为只是 unsigned char 的 typedef,但事实并非如此。

以上是关于如何在 C++17 中将 std::string 转换为 std::vector<std::byte>?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将 std::string 转换为 const char [重复]

如何在MFC中将std:string转换为LPCTSTR

在c ++ 11中将std :: string转换为char * [重复]

如何在 C++ 中将整个文件读入 std::string?

如何在 C++ 中将 char 指针附加到 std::string

在 C++ 中将字符串转换为 Cstring