Есть ли простой способ получить число из набора байтов, когда начальные биты игнорируются из каждого байта? - PullRequest
0 голосов
/ 12 февраля 2011

Я пытаюсь получить число из набора байтов с помощью JavaScript в Google Chrome, из ArrayBuffer , чтобы получить информацию о теге MP3.Спецификация ID3v2 гласит , что для получения размера тега необходимо взять 4 байта в определенном месте и получить из них целочисленное значение, кроме:

Размер тега ID3v2 закодированс четырьмя байтами, где старший значащий бит (бит 7) установлен в ноль в каждом байте, что составляет в общей сложности 28 бит.Обнуляемые биты игнорируются, поэтому тег длиной 257 байт представляется в виде $ 00 00 02 01.

Наивный способ сделать это - пройти через каждый байт и получить значения для каждого бита.и получим новые 4-байтовые значения, полученные из 7 битов из исходных 4 байтов, например, скажем, у нас есть эти 4 исходных байта:

0111 1111 0111 1111 0111 1111 0111 1111

Я создаю новый ArrayBuffer и перебираю каждый бит дляпроизводить:

0000 1111 1111 1111 1111 1111 1111 1111

И затем я вычисляю целочисленное значение из этого 32-битного целого, используя Uint32Array

Есть ли более простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Если подумать, то у вас есть 4-значный номер base-128. Каждый из байтов содержит одну «цифру», а каждая «цифра» представляет собой значение от 0 до 127 (включительно). Таким образом, чтобы превратить их в пригодное для использования число, вы просто умножаете и добавляете, как если бы вы делали это с любой другой базой: наименее значимая «цифра» - это цифра «одного места», следующая - «128 с» Далее идет «16384», а наиболее значимая цифра - «2097152».

Я не уверен, как именно это показать в коде, потому что я не очень знаком с новыми API "ArrayBuffer"; Вы используете ArrayBufferView или что-то, чтобы получить доступ к значениям, верно? Предполагая, что отдельные байты легко получить, функция умножения и сложения должна быть очень простой.

1 голос
/ 11 марта 2011

Если вы просто нацелены на Chrome, вы также можете использовать DataViews для считывания различных типов данных вашего потока байтов: https://developer.mozilla.org/en/JavaScript_typed_arrays/DataView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...