【问题标题】:C++ STL's String eqivalent for Binary Data二进制数据的 C++ STD 字符串等效项
【发布时间】:2010-10-24 15:56:05
【问题描述】:

我正在编写一个 C++ 应用程序,我想知道 C++ 在内存中存储字节数组的传统方式是什么。

是否有类似字符串的东西,除了专门为二进制数据制作的。

现在我使用 *unsigned char** 数组来存储数据,但更像 STL/C++ 的东西会更好。

【问题讨论】:

标签: c++ string stl binary


【解决方案1】:

我会使用std::vector<unsigned char>。您需要的大多数操作都可以使用带有迭代器范围的 STL 来完成。另外,请记住,如果您确实需要原始数据,&v[0] 保证会提供指向底层数组的指针。

【讨论】:

  • v.data()更清晰时,无需依赖&v[0]
  • @LimitedAtonement 确实如此,但早在 2009 年,data() 并没有在 std::vector 上定义。
【解决方案2】:

您也可以将std::string 用于二进制数据。 std::string 中的数据长度是显式存储的,不是由空终止决定的,因此空字节在 std::string 中没有特殊含义。

std::string 通常比std::vector<char> 更方便,因为它提供了许多对处理二进制数据有用但vector 没有提供的方法。要解析/创建二进制数据,使用 substr()+std::stringstream 的重载等内容是很有用的。在向量上,来自<algorithm> 的算法可用于实现相同的效果,但它比字符串方法更笨拙。如果您只是对“字符序列”进行操作,std::string 会为您提供您通常想要的方法,即使这些序列恰好包含“二进制”数据。

【讨论】:

  • 或 std::vector
  • 我也会使用 std::vector.
  • std::vector 的优点是可以将其内容作为 /writable/ char 指针(通过 &vec[0])获取。另一方面,你没有得到 std::string 实现中常见的写时复制优化。
  • @bdonlan:来自 &obj[0] 的可写缓冲区也适用于 std::string 隐含地通过其他要求。事实上,0x 明确表示了这一点。
【解决方案3】:

您应该使用std::vector<unsigned char>std::vector<uint8_t>(如果您有现代的stdint.h 标头)。如果您使用固定大小的缓冲区,使用unsigned char[]uint8_t[] 没有任何问题。 std::vector 真正闪耀的地方是当您需要经常增长或附加到缓冲区时。 STL 迭代器与指针具有相同的语义,因此 STL 算法同样适用于 std::vector 和普通旧数组。

正如CAdaker 所指出的,表达式&v[0] 保证为您提供指向向量缓冲区的基础指针(并且保证它是一个连续的内存块)。此保证已添加到 C++ 标准的附录中。

就我个人而言,我会避免使用std::string 来操作任意字节缓冲区,因为我认为这可能会造成混淆,但这并不是一种闻所未闻的做法。

【讨论】:

    【解决方案4】:

    有多种解决方案,但最接近的一个(我觉得)是std::vector<std::byte>>,因为它直接在代码中表达了意图。

    发件人:https://en.cppreference.com/w/cpp/types/byte

    std::byte 是一个独特的类型,它实现了 byte 的概念 在 C++ 语言定义中指定。

    与 char 和 unsigned char 一样,它可用于访问原始内存 被其他对象占据(对象表示),但不同于那些 类型,它不是字符类型,也不是算术类型。一种 byte 只是位的集合,并且定义的唯一运算符 它是按位的。

    【讨论】:

      【解决方案5】:

      std::basic_string<uint8_t> 怎么样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 2011-06-19
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        相关资源
        最近更新 更多