繁体   English   中英

C++:如何以独立于平台的方式读写多字节 integer 值?

[英]C++: How to read and write multi-byte integer values in a platform-independent way?

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

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

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

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

因此,这个想法是:

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

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

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

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

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

  • 长度指示
  • 结束标记

您显然将它们与一些值位合并。

  • 对于一个长度指示,它会给你一些长度和一些位一起给出的东西(参见例如 UTF-8),

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

其他变体显然是可能的。

您可以尝试 网络字节顺序

Google 的协议缓冲区提供了使用可变宽度编码的预制实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM