我有以下结构:
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
值复制到较小空间时不会丢失任何数据。
答案 0 :(得分:5)
答案 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的东西。