[英]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
值復制到較小的空間時不會丟失任何數據。
我只會使用一個函數:
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 );
由於您的代碼無論如何都不是可移植的,因此您最好在這里使用位域:
struct sample {
uint8_t four:4;
bool empty:1;
bool b:1;
uint8_t two:2;
};
我不喜歡位字段,但是它們似乎適用於您的情況。
您的位順序以...獨特的方式顯示。 通常,當我們用二進制表示值時,低位顯示在右側。 只要打包和拆包數據,就可以選擇位順序。 不過要注意網絡順序與系統順序。 盡管在每個平台上字節內的位順序都相同,但字中的字節順序可以更改。
您必須了解您的應用程序才能確定打包/拆包是否值得。 兩端需要進行更多計算,具體取決於UDP數據包之間的間隔以及每個UDP數據包中打包了多少數據,這可能不值得。 如果您只是想為蜂窩應用程序保存數據,那么,謝謝:@)
我總是避免由於平台/編譯器的偏執而轉移布爾值。 可以使用類似sb?32:0之類的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.