1

我想知道你是否可以在位中定义一个类型。具体来说,我想定义一个 24 位类型,以便存储 RTP 中丢失的包的累积数量。

如果没有,我怎样才能从一个 int.memcpy 中提取 3 个字节。如果我这样做,我不确定它会如何结束:

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

3 回答 3

2

您可以使用位域定义至少 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 处。

于 2013-04-22T04:05:19.247 回答
1

在 C 中,您只能根据基本类型或位域来定义整数类型。

位域很古怪。你不能拿他们的地址。如果您只需要 24 位,它们不会为您节省任何空间,但您的平台只有 8、16 和 32 位的基本类型。您仍然需要使用 3 个 8 位整数或 1 个 32 位整数(或 1 个 16 位和 1 个 8 位)来存储您的 24 位。

对于像计数器这样简单的东西,我只使用一个 32 位整数。如果我有兴趣将其限制为 24 位值,我有两个选择:

  • 将 8 个最高有效位清零,从而模拟回绕
  • 将值限制为 2 24 -1,因此它永远不会超过它也不会环绕
于 2013-04-22T03:58:20.430 回答
0

您可以将一个窄整数存储在一个较大的整数中。只需屏蔽您想要的位。

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

或者,您可以在结构成员上定义位域。但是不要尝试将结构写入磁盘并在不同的系统上打开它,因为位域布局不是标准化的。

struct {
    long data:24;
};
于 2013-04-22T04:00:35.683 回答