【问题标题】:C++: How to read and write multi-byte integer values in a platform-independent way?C++:如何以独立于平台的方式读写多字节整数值?
【发布时间】:2011-06-06 14:42:59
【问题描述】:

我正在开发一个简单的协议,用于从缓冲区读取/写入整数值。绝大多数整数都低于 128,但更大的值是可能的,所以我正在研究某种形式的多字节编码来以简洁的方式存储值。

以独立于平台(即字节顺序不可知)的方式读取/写入多字节值的最简单和最快的方法是什么?

【问题讨论】:

  • 文字有很多话要说。
  • 只是不太节省空间,这可能对二进制协议有一些影响。
  • 数值大多少?任意大小,还是有固定的限制?签名还是未签名?
  • 确定平台无关的格式,然后以平台相关的方式以该格式存储它们。
  • @DevSolar:如果空间是一个因素,那么对于使用通用压缩,构造消息之后有很多话要说。如果您发送大量非常小的数据包当然会失败,但您不必为每个字段发明一种不同的巧妙简洁格式。

标签: c++ protocols multibyte


【解决方案1】:

XDR 格式可能会对您有所帮助。如果非要用一句话来概括,那就是整数的一种二进制UTF-8。

编辑:正如我在下面的评论中提到的,我“了解”XDR,因为我在办公室工作中使用了几个与 XDR 相关的功能。只有在您的评论之后,我才意识到我每天使用的“打包 XDR”格式甚至不是官方 XDR 文档的一部分,所以我将单独描述它。

这个想法是这样的:

  • 检查字节的最高有效位。
    • 如果是0,那个字节就是的值。
    • 如果为 1,接下来的三位给出“字节数”,即值中的字节数。
      • 屏蔽顶部半字节(标志位加上字节数),连接适当数量的字节,您就得到了值。

我不知道这是“真实”格式还是我(前)同事自己创建的(这就是我不发布代码的原因)。

【讨论】:

  • XDR 很有趣,但是它的最小值大小是 4 字节,所以我没有获得任何空间效率。
  • @Jen:D'oh...直到现在我才意识到同事实施的“打包 XDR”格式显然不是官方 XDR 文档的一部分...
【解决方案2】:

您可能对以下功能感兴趣:

htonl, htons, ntohl, ntohs - 转换 主机和网络字节之间的值 顺序

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

man byteorder

【讨论】:

  • 不知道你是不是讽刺(“....”),但如果你不是,很高兴为您提供帮助! :-)
  • 非常严肃,这以标准化的方式解决了字节序问题(我的问题中更具挑战性的部分)——谢谢!
【解决方案3】:

文字将是我的第一选择。如果你想要一个可变长度的二进制编码,你有两个基本的选择:

  • 长度指示
  • 结束标记

你显然用一些值位合并了那些。

  • 对于长度指示,它可以为您提供长度和一些位一起给出的信息(参见例如 UTF-8),

  • 例如,对于结束标记,您可以声明 MSB 集指示最后一个字节,因此每个字节有 7 个数据位。

其他变体显然是可能的。

【讨论】:

    【解决方案4】:

    你可以试试Network Byte Order

    【讨论】:

      【解决方案5】:

      Google 的 protocol buffers 提供了一个使用可变宽度编码的预制实现。

      【讨论】:

      • 是的,协议缓冲区是一个很好的解决方案。由于我的用例简单,我接受了 DevSolar 的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多