【问题标题】:Best way to represent raw bytes in a std::vector?在 std::vector 中表示原始字节的最佳方法?
【发布时间】:2012-09-12 16:34:12
【问题描述】:

我正在使用 ZeroMQ 库,它使用void * 来表示任意二进制数据块。但是我想使用std::vector 来复制和移动这些块。制作代表原始字节的std::vector 的首选惯用方法是什么?我目前使用的是std::vector<unsigned char>,但我想确保我的代码对其他人有意义。

【问题讨论】:

  • unsigned char 可以。如果要强调八位字节部分,也可以使用uint8_t
  • 我会typedef uint8_t byte;,或者甚至可以开设一个你真的无能为力的课程。 (不加字节)
  • ZeroMQ 本身是否指定在任何地方读取数据是“作为字符”还是“作为无符号字符”读取数据?如果没有,那么 unsigned char 应该没问题。如果它指定了char,那么您可能希望使用它来强调您正在提供库所期望的内容。反正应该没什么区别。
  • ZeroMQ 是一个消息传递库,因此除了在线复制和发送之外,它从不对数据做任何事情。所以我觉得没关系...

标签: c++ sockets stl buffer stdvector


【解决方案1】:

要么

std::vector<unsigned char>

#include <cstdint>

std::vector<std::uint8_t>

我觉得两个都不错。

【讨论】:

  • uint8_t 不会在没有 8 位字节的系统上存在。 uint_least8_t 可能是更好的选择,但unsigned char 是最好的选择。
  • 这个解决方案似乎被广泛用于存储原始数据。对我来说,不清楚为什么要使用“uint8_t”而不是“int8_t”——有人知道优势吗? Java 确实只有带符号的数据类型,那为什么在 c++ 中使用 unsigned int 呢?
【解决方案2】:

如果您不知道数据的性质,unsigned char 是您可以表示而不会弄乱的最小位块。因此,它是任何类型的任意内存块的通用类型。

所以你的矢量看起来非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2020-04-20
    • 2017-08-22
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多