Как-то так:
function uint7ArrayToUint28(uint7Array) {
var uint28 = 0;
for (var i = 0, pow = 21; pow >= 0; pow -= 7, i++) {
uint28 += uint7Array[i] << pow;
}
return uint28;
}
var firstTenBytes = new Uint8Array(reader.result, 0, 10); // reader.result из вашего примера
var id3TagSize = uint7ArrayToUint28([
firstTenBytes[6], firstTenBytes[7],
firstTenBytes[8], firstTenBytes[9]
]) + 10;
Размер ID3 тега хранится за вычетом заголовка (10 байт) - согласно спецификации. Поэтому нужно ещё 10 добавить. Я как-то это проглядел в спецификации, потом всплыл баг - музыка не воспроизводилась.
По сути всё сводится к этому:
var size = bytes[9];
size += bytes[8] << 7;
size += bytes[7] << 14;
size += bytes[6] << 21;
size += 10; // заголовок
Цитата:
|
В консоли 6-9 байты содержат такие числа: 0 5 45 56. Как оперируя этими данными получить длину в байтах. Длина в данном случае 87736 байт.
|
Рассмотрим пример с вашими данными:
var size = 56;
size += 45 << 7; // 5760 + 56 = 5816
size += 5 << 14; // 81920 + 5816 = 87736
size += 0 << 21; // 0 + 87736 = 87736 - размер ID3 тега без заголовка
size += 10; // 87736 + 10 = 87746 - размер ID3 тега
Чтобы понимать, что тут происходит рекомендую почитать про
побитовые операторы JS.