1

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

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

因此,我需要读取前 5 位以获取索引整数,以在上表中查找此音频流的采样率。然后我需要获取最后三位来查找协议。我已经阅读了按位运算符,并且在非常基本的层面上,我了解其中的一些操作,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 - 这是完整 VBAN 规范的链接,以防万一它有帮助或者您只是感兴趣。

4

1 回答 1

2

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

以a0xab为例(Number可以用8位表示的整数)

> 0xab.toString(2)
'10101011'

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

右移>>值以删除低 5 位:

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

AND&带有00011111掩码的值以删除最高 3 位。

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

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

于 2020-09-22T02:16:32.960 回答