簡體   English   中英

如何將n位完全寫入UDP包c ++

[英]How to write EXACTLY n bits to UDP packet c++

作為學習大學內容的一種方式,我決定開始使用UDP和新的線程內存模型在c ++ 11中編寫網絡庫。 這是我目前最大的障礙。

字節的大小是特定於平台的。 Memcpy根據該平台上的字節大小進行復制和寫入。 那么我該如何制作與平台無關的代碼來准確地將 N位寫入我的UDP數據包呢? N通常是8的倍數,但我需要確保當我處理N個字節時,無論平台如何,都會修改相同數量的位。

我認為最接近解決方案的是使用32位的基本結構,並將其作為8組進行訪問。例如

struct Data
{
    char a : 8;
    char b : 8;
    char c : 8;
    char d : 8;
}

這樣,我知道每個char將限制為8個字節。 我的消息都是32的倍數 - 這沒問題(這個結構在處理字節序時實際上會有幫助)。 但是,我怎么能確定編譯器不會將結構填充到平台的原生邊界? 這會有用嗎?

您的數據結構不足。 char類型被編譯器定義為signed char (7個數據位,1個符號位), unsigned char (8個數據位)或char

發送數據包的大多數計算機使用unsigned charuint8_t作為八位字節。

另外,要注意多字節排序,稱為Endianness。 Big endian是最重要的字節首先出現的地方; 小端是最不重要的字節首先出現的地方。

許多消息傳遞方案將使用零填充剩余的位,以使它們達到8位,16位或32位數量。

您可能正在尋找#pragma pack(nopack)指令。 正如有人指出的那樣,你仍然會處理8位的倍數。

char應該總是正好1個字節,AFAIK雖然我可能是錯的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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