如何在 C# 中使用 32 位大端掩码移位从字节数组中获取位值

How to get bit values from byte array using shifting with 32 bit big endian mask in C#

我有一个四字节数组(代表一个 MPEG TS 数据包 header),我想获得从第 12 位到第 24 位(粗体)开始的 13 位 PID 值。 Wikipedia 说 PID 值有一个 32 位大字节序掩码...这是什么意思?

0100 0111 0000 0101 0011 0100 0001 1101

我理解第一个字节或八位是0x47,因为有8位...

128 64 32 16 8 4 2 1

0 1 0 0 0 1 1 1

0x47 是 71 或 64 + 4 + 2 + 1...

如何解析字节数组中不是跨字节嵌入的 8 位 and/or 的位值?

首次摘自维基百科https://en.wikipedia.org/wiki/Endianness#Big

The most significant byte (MSB) value, 0Ah, is at the lowest address. The other bytes follow in decreasing order of significance. This is akin to left-to-right reading in hexadecimal order.

因此数组中的位顺序正确,您只需要值。 您可以通过获取第一个字节(忽略前 3 位)、将其移动 8 位然后添加第二个字节来创建一个整数。

byte[] packet = new byte[4];
int value = ((0x1F & packet[1]) << 8) | packet[2];

这为您的示例提供了 0x0534 (101 0011 0100)。然后你可以将这个值与维基百科上列出的值进行比较。