从字节数组(缓冲区)中的字节中提取位的最简单方法是什么?

What is the simplest way to extract bits from a byte in a byte array (buffer)?

我正在编写一个工具来将 VBAN 流转换为原始 PCM 音频流。它正在工作,但数据包 header 中有几个区域,我想要的信息只有几位而不是完整的八位位组。我对按位运算符等不太熟悉,所以我想知道提取此信息的最佳方法是什么。例如,这里是 VBAN 数据包的剖析 header.

您可以看到第5个字节(字节数组中的索引4)在前5位包含SR索引,在其余3位包含子协议选择。这里有一些关于这些的更多信息以帮助说明。

所以我需要读取前 5 位以获得索引整数,以便在上面的 table 上查找此音频流的采样率。然后我需要得到最后三位来查找协议。我已经阅读了按位运算符,并且在非常基础的层面上我理解其中的一些,比如 1 & 1 = 1 但是一旦我们开始移位和其他东西我就开始迷路了,我似乎无法弄清楚如何使用这些东西从这个字节中得到我需要的东西。

我已经能够接收 VBAN 数据包并解析出我感兴趣的字节。我唯一需要的是如何从字节中提取位。

const dgram = require("dgram");
const udp = dgram.createSocket("udp4");

udp.on("message", (msg, rinfo) => {
  let srpByte = msg[4];

  // This is where I'm stuck
  let srIndex = ???;
  let subProtocol = ???;
});

udp.bind(6980, "0.0.0.0"); // Listening for VBAN packets on port 6980 from any IP.

PS - 这是 a link to the full VBAN specification 如果它对您有帮助或者您只是感兴趣。

不是这方面的专家,但最近不得不做类似的事情,如果我的术语或方法很奇怪,请道歉...

0xab为例(可以用8位表示的整数Number

> 0xab.toString(2)
'10101011'

对于前 3 位 101 和最后 5 位 01011 作为独立值:

Right shift >>去掉低5位的值:

> (0xab >> 5).toString(2)
'101'

AND & 使用 00011111 掩码删除最高 3 位的值。

> 0x1f.toString(2)
'11111'
> (0xab & 0x1f).toString(2)
'1011'

此结果中的前导 0 被截断,就像被屏蔽掉的 3 位一样。