簡體   English   中英

復制字節緩沖區內的結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM