我想知道是否可以用位定義類型。 具體來說,我想定義一個24位的類型,以便存儲在RTP中丟失的包的累計數量。按位定義c類型
如果不是,我如何從int中memcpy 3個字節。 如果我這樣做,我不知道它會如何結束:
memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));
我想知道是否可以用位定義類型。 具體來說,我想定義一個24位的類型,以便存儲在RTP中丟失的包的累計數量。按位定義c類型
如果不是,我如何從int中memcpy 3個字節。 如果我這樣做,我不知道它會如何結束:
memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));
您可以定義類型與使用位域至少24位,但一個位域必須是一個struct
的成員:
struct {
unsigned pkgs_lost: 24;
};
無論你使用這樣的位域,或只是一個簡單的鍵入至少24位,如unsigned long
將值存儲在您的應用程序中,當您將其複製到RTP數據包時,最簡單的便攜方式是一次複製一個字節。這是因爲RTP數據包中的值總是大端的,並且主機的字節序是未知的。
假設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位的值,我有兩個選擇:
如果我限制了這個值,我只需要進行左邊的邏輯移位就可以得到3個第一個字節,對吧? – 2013-04-22 04:03:13
我沒有看到你的觀點。 – 2013-04-22 05:17:35
您可以在較大的整數中存儲一個窄整數。只是掩蓋你想要的位。
int main() {
long data;
data & 0xFFFFFF;
}
或者,您可以在結構成員上定義一個位域。但不要嘗試將結構寫入磁盤並在不同的系統上打開它,因爲位域佈局是不標準。
struct {
long data:24;
};
Google'Bit fields' – 2013-04-22 03:20:04
@MartinJames由於無法取得位字段的地址,所以與'memcpy'無關。但是OP不應該使用'memcpy'。 – 2013-04-22 03:38:34
'sizeof(char)'是'1'。 – 2013-04-22 04:01:43