在字节缓冲区中复制一个结构

Copy a struct inside a byte buffer

我有以下结构:

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

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

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

复制此字节中的结构值的最佳方法是什么?我在执行此操作之前检查了前提条件,因此在将 uint8_t 值复制到 less space.

时不应丢失任何数据

既然你的代码无论如何都不可移植,你不妨在这里使用位域:

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

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

我只想使用一个函数:

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 );

您的位顺序以...独特的方式显示。通常当我们用二进制表示值时,低位显示在右边。只要您正在打包和解包数据,您就可以选择您的位顺序。不过要注意网络顺序与系统顺序。虽然字节内的位顺序在每个平台上都是相同的,但字内的字节顺序可以改变。

您必须了解您的应用程序才能确定 packing/unpacking 是否值得付出努力。在每一侧进行更多计算,并且取决于 UDP 数据包之间的间隔以及每个 UDP 数据包中打包的数据量,这可能不值得。如果您只是想为蜂窝应用程序保存数据,那么,谢谢 :@)

由于 platform/compiler 偏执狂,我总是避免转移布尔值。可以改用 s.b?32:0 之类的东西。