2013-04-22 50 views
1

我想知道是否可以用位定義類型。 具體來說,我想定義一個24位的類型,以便存儲在RTP中丟失的包的累計數量。按位定義c類型

如果不是,我如何從int中memcpy 3個字節。 如果我這樣做,我不知道它會如何結束:

memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char)); 
+0

Google'Bit fields' – 2013-04-22 03:20:04

+0

@MartinJames由於無法取得位字段的地址,所以與'memcpy'無關。但是OP不應該使用'memcpy'。 – 2013-04-22 03:38:34

+0

'sizeof(char)'是'1'。 – 2013-04-22 04:01:43

回答

2

您可以定義類型與使用位域至少24位,但一個位域必須是一個struct的成員:

struct { 
    unsigned pkgs_lost: 24; 
}; 

無論你使用這樣的位域,或只是一個簡單的鍵入至少24位,如unsigned long將值存儲在您的應用程序中,當您將其複製到RTP數據包時,最簡單的便攜方式是一次複製一個字節。這是因爲RTP數據包中的值總是大端的,並且主機的字節序是未知的。

假設pkgunsigned char *類型的,你會做這樣的事情:

pkg[33] = pkgs_lost >> 16; 
pkg[34] = pkgs_lost >> 8; 
pkg[35] = pkgs_lost; 

放置24位大端數字節位置33在輸出數據包。

1

在C語言中,你只能在基本類型或者其位域來定義整數類型。

位域很古怪。你不能接受他們的地址。如果你只需要24位,它們不會節省任何空間,但是你的平臺只有8,16和32位的基本類型。您仍然需要使用3個8位整數或1個32位整數(或1個16位和1個8位)來存儲您的24位數據。

對於像計數器那樣簡單的事情,我只是使用一個32位整數。如果我有興趣將其限制在24位的值,我有兩個選擇:

  • 歸零,8個最顯著位,從而模擬左右
  • 一個包裹限制值2 -1 ,所以它永遠不會超過它,也不會環繞它
+0

如果我限制了這個值,我只需要進行左邊的邏輯移位就可以得到3個第一個字節,對吧? – 2013-04-22 04:03:13

+0

我沒有看到你的觀點。 – 2013-04-22 05:17:35

0

您可以在較大的整數中存儲一個窄整數。只是掩蓋你想要的位。

int main() { 
    long data; 
    data & 0xFFFFFF; 
} 

或者,您可以在結構成員上定義一個位域。但不要嘗試將結構寫入磁盤並在不同的系統上打開它,因爲位域佈局是不標準

struct { 
    long data:24; 
};