0

我试图在 Google Chrome 中使用 JavaScript 从一组字节中生成一个数字,从ArrayBuffer中获取 MP3 标记信息。ID3v2 规范规定,要获取标签大小,您必须在某个位置占用 4 个字节并从中获取整数值,除了:

ID3v2 标签大小用四个字节编码,其中最高有效位(第 7 位)在每个字节中设置为零,总共 28 位。零位被忽略,因此 257 字节长的标签表示为 $00 00 02 01。

天真的方法似乎是遍历每个字节并获取每个位的值并产生一个新的 4 字节值,由原始 4 个字节的 7 个位产生,例如我们有这 4 个原始字节:

0111 1111 0111 1111 0111 1111 0111 1111

我创建了一个新的 ArrayBuffer 并遍历每个位以产生:

0000 1111 1111 1111 1111 1111 1111 1111

然后我使用Uint32Array从这个 32 位整数计算整数值

有没有更简单的方法来做到这一点?

4

2 回答 2

2

如果你仔细想想,你得到的是一个 4 位的 base-128 数字。每个字节包含一个“数字”,每个“数字”是 0 到 127(含)之间的值。因此,要将它们变成一个可用的数字,您只需像使用任何其他基数一样进行乘法和加法:最低有效的“数字”是“一个位”数字,下一个是“128s”,接下来是“16384s”,最高位是“2097152s”位。

我不确定如何在代码中显示这一点,因为我不太熟悉新的“ArrayBuffer”API;您使用“ArrayBufferView”或其他东西来访问这些值,对吗?好吧,假设很容易获得单个字节,那么进行乘法和加法应该是一个非常简单的函数。

于 2011-02-12T17:19:01.727 回答
1

如果您只是针对 Chrome,您还可以使用 DataViews 读取字节流的不同数据类型:https ://developer.mozilla.org/en/JavaScript_typed_arrays/DataView

于 2011-03-11T08:48:35.830 回答