在字节缓冲区内复制struct

时间:2016-07-28 19:26:42

标签: c++ byte buffer memcpy bytebuffer

我有以下结构:

struct sample {
  uint8_t four;
  bool    b;
  uint8_t two;
};

为了发送udp数据包,我需要将这些值打包成一个字节:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
|     four      | 0 | b |  two  |
+---------------+---+---+-------+

在此字节中复制struct值的最佳方法是什么?我在执行此操作之前检查前提条件,因此在将uint8_t值复制到较小空间​​时不会丢失任何数据。

3 个答案:

答案 0 :(得分:5)

我只想使用一个函数: uint8_t pack(const sample& s) {     return(s.four& 0xF)| (s.b<< 5)| ((s.two& 3)<< 6); } 正如您所说的那样,检查数据范围可以简化为:     return s.four | (s.b<< 5)| (s.two<< 6);

答案 1 :(得分:2)

由于您的代码无论如何都不可移植,您也可以在这里使用位字段:

struct sample {
  uint8_t four:4;
  bool    empty:1;   
  bool    b:1;
  uint8_t two:2;
};

我不喜欢位字段,但它们似乎适用于您的情况。

答案 2 :(得分:0)

您的位顺序以...独特的方式显示。通常当我们用二进制表示值时,右侧会显示低位。只要您打包并解压缩数据,就可以选择位顺序。请注意网络订单与系统订单。虽然每个平台上的字节内位数相同,但字节顺序可以改变。

您必须知道您的申请,以确定包装/拆包是否值得付出努力。每侧都有更多的计算,并且根据UDP数据包之间的间隔以及每个UDP数据包中打包了多少数据,这可能不值得。如果您只是想为蜂窝应用程序保存数据,那么,谢谢:@)

由于平台/编译器的偏执,我总是避免转移布尔值。可以使用类似s.b?32:0的东西。