我想知道是否可以用位定义类型。 具体来说,我想定义一个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