我想知道你是否可以用比特定义一个类型。 具体来说,我想定义一个24位类型,以便在RTP中存储丢失的累计包数。
如果没有,我如何从int中记忆3个字节。 如果我这样做,我不确定它会如何结束:
memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));
答案 0 :(得分:2)
您可以使用位域定义至少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处。
答案 1 :(得分:1)
在C中,您只能根据基本类型或位域来定义整数类型。
Bitfields古怪。你不能拿他们的地址。如果您只需要24位,它们将不会为您节省任何空间,但您的平台只有8位,16位和32位的基本类型。你仍然需要使用3个8位整数或1个32位整数(或1个16位和1个8位)来存储你的24位。
对于像计数器这样简单的东西,我只使用32位整数。如果我有兴趣将其限制为24位值,我有两个选择:
答案 2 :(得分:0)
您可以将较大的整数存储在较大的整数中。只需屏蔽你想要的位。
int main() {
long data;
data & 0xFFFFFF;
}
或者,您可以在结构成员上定义位域。但是不要尝试将结构写入磁盘并在不同的系统上打开它,因为位域布局不是标准化的。
struct {
long data:24;
};