[英]Define a c type in bits
我想知道你是否可以用比特定義一個類型。 具體來說,我想定義一個24位類型,以便在RTP中存儲丟失的累計包數。
如果沒有,我如何從int中記憶3個字節。 如果我這樣做,我不確定它會如何結束:
memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));
您可以使用位域定義至少24位的類型,但是位域必須是struct
的成員:
struct {
unsigned pkgs_lost: 24;
};
無論是使用這樣的位域,還是僅使用至少24位像unsigned long
的簡單類型來將值存儲到應用程序中,當您將其復制到RTP數據包時,最簡單的可移植方式是將其復制到一個字節一時間 這是因為RTP數據包中的值始終是big-endian,並且主機的字節順序未知。
假設pkg
是unsigned char *
類型,你可以這樣做:
pkg[33] = pkgs_lost >> 16;
pkg[34] = pkgs_lost >> 8;
pkg[35] = pkgs_lost;
將24位大端數字放在輸出數據包的字節位置33。
在C中,您只能根據其基本類型或位域來定義整數類型。
比特菲爾德很古怪。 你不能拿他們的地址。 如果您只需要24位,它們將不會為您節省任何空間,但您的平台只有8位,16位和32位的基本類型。 您仍然需要使用3個8位整數或1個32位整數(或1個16位和1個8位)來存儲您的24位。
對於像計數器這樣簡單的東西,我只使用32位整數。 如果我有興趣將其限制為24位值,我有兩個選擇:
您可以將較大的整數存儲在較大的整數中。 只需屏蔽你想要的位。
int main() {
long data;
data & 0xFFFFFF;
}
或者,您可以在結構成員上定義位域。 但是不要嘗試將結構寫入磁盤並在不同的系統上打開它,因為位域布局不是標准化的 。
struct {
long data:24;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.