我想知道你是否可以在位中定义一个类型。具体来说,我想定义一个 24 位类型,以便存储 RTP 中丢失的包的累积数量。
如果没有,我怎样才能从一个 int.memcpy 中提取 3 个字节。如果我这样做,我不确定它会如何结束:
memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));
您可以使用位域定义至少 24 位的类型,但位域必须是 a 的成员struct
:
struct {
unsigned pkgs_lost: 24;
};
无论您使用这样的位域,还是仅使用至少 24 位的简单类型unsigned long
来存储应用程序中的值,当您将其复制到 RTP 数据包时,最简单的可移植方式是一次复制一个字节. 这是因为 RTP 数据包中的值始终是 big-endian,而您的主机的字节序是未知的。
假设它pkg
是 type 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 位值,我有两个选择:
您可以将一个窄整数存储在一个较大的整数中。只需屏蔽您想要的位。
int main() {
long data;
data & 0xFFFFFF;
}
或者,您可以在结构成员上定义位域。但是不要尝试将结构写入磁盘并在不同的系统上打开它,因为位域布局不是标准化的。
struct {
long data:24;
};