2013-04-22 52 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; 
};