C ++:如何以独立于平台的方式读取和写入多字节整数值?

时间:2011-06-06 14:43:00

标签: c++ protocols multibyte

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

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

5 个答案:

答案 0 :(得分:3)

XDR格式可能对您有所帮助。如果我不得不用一个句子来概括它,它就是一种用于整数的二进制UTF-8。

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

这个想法是这样的:

  • 检查字节的最重要位。
    • 如果为0,则该字节 该值。
    • 如果为1,则接下来的三位给出“字节计数”,即值的字节数。
      • 屏蔽掉顶部半字节(标志位加字节计数),连接适当的字节数并获得该值。

我不知道这是一个“真实”格式还是我(前)的同事自己创建了这个(这就是为什么我不发布代码)。

答案 1 :(得分:2)

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

  

htonl,htons,ntohl,ntohs - convert   主机和网络字节之间的值   为了

   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

答案 2 :(得分:2)

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

  • 长度指示
  • 结束标记

你显然会合并那些带有一些值位的东西。

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

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

其他变种显然是可能的。

答案 3 :(得分:1)

您可以尝试Network Byte Order

答案 4 :(得分:1)

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