在字节缓冲区中复制一个结构
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 之类的东西。
我有以下结构:
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 之类的东西。