Чтение бит в javaScript

512
11 сентября 2017, 06:41

Доброго времени суток. Решил переписать один алгоритм с JS на C#, а так в JS не шарю, то столкнулся с некоторыми проблемами. Вот одна из них

// before we start anything we need to get byte-aligned bstream.readBits( (8 - bstream.bitPtr) & 0x7 );

Чисто интуитивно я понимаю, что тут происходит чтение бит из потока, но вот что в скобках происходит, не могу понять. Искал в инете функции bitPtr - не нашёл. Помогите разобраться. Заранее спасибо.

P.S. Вот сама функция, которую я переписываю.

function RarReadTables(bstream) { 
  const BitLength = new Array(rBC); 
  const Table = new Array(rHUFF_TABLE_SIZE); 
 
  // before we start anything we need to get byte-aligned 
  bstream.readBits( (8 - bstream.bitPtr) & 0x7 ); 
   
  if (bstream.readBits(1)) { 
    info("Error!  PPM not implemented yet"); 
    return; 
  } 
   
  if (!bstream.readBits(1)) { //discard old table 
    for (let i = UnpOldTable.length; i--;) { 
      UnpOldTable[i] = 0; 
    } 
  } 
 
  // read in bit lengths 
  for (let I = 0; I < rBC; ++I) { 
    const Length = bstream.readBits(4); 
    if (Length == 15) { 
      let ZeroCount = bstream.readBits(4); 
      if (ZeroCount == 0) { 
        BitLength[I] = 15; 
      } 
      else { 
        ZeroCount += 2; 
        while (ZeroCount-- > 0 && I < rBC) 
          BitLength[I++] = 0; 
        --I; 
      } 
    } 
    else { 
      BitLength[I] = Length; 
    } 
  } 
   
  // now all 20 bit lengths are obtained, we construct the Huffman Table: 
 
  RarMakeDecodeTables(BitLength, 0, BD, rBC); 
   
  const TableSize = rHUFF_TABLE_SIZE; 
  for (let i = 0; i < TableSize;) { 
    const num = RarDecodeNumber(bstream, BD); 
    if (num < 16) { 
      Table[i] = (num + UnpOldTable[i]) & 0xf; 
      i++; 
    } else if (num < 18) { 
      let N = (num == 16) ? (bstream.readBits(3) + 3) : (bstream.readBits(7) + 11); 
 
      while (N-- > 0 && i < TableSize) { 
        Table[i] = Table[i - 1]; 
        i++; 
      } 
    } else { 
      let N = (num == 18) ? (bstream.readBits(3) + 3) : (bstream.readBits(7) + 11); 
 
      while (N-- > 0 && i < TableSize) { 
        Table[i++] = 0; 
      } 
    } 
  } 
   
  RarMakeDecodeTables(Table, 0, LD, rNC); 
  RarMakeDecodeTables(Table, rNC, DD, rDC); 
  RarMakeDecodeTables(Table, rNC + rDC, LDD, rLDC); 
  RarMakeDecodeTables(Table, rNC + rDC + rLDC, RD, rRC);   
   
  for (let i = UnpOldTable.length; i--;) { 
    UnpOldTable[i] = Table[i]; 
  } 
  return true; 
}

Answer 1

bitPtr - это не функция а переменная, в которой хранится в каком конкретно бите вы сейчас находитесь...это порядковый номер бита. Переменная соответственно хранит значения от 0 до 7.

Читайте исходники библиотек, которыми Вы пользуетесь: https://github.com/codedread/bitjs/blob/master/io/bitstream.js#L36

READ ALSO
Не грузится popup.js в popup.html в расширении Chrome

Не грузится popup.js в popup.html в расширении Chrome

Загружаю файл popupjs в файл popup

288
Не применяется декоратор @observable

Не применяется декоратор @observable

Пытаюсь написать store для mobxПростейший пример:

256
Вставка IMG в DIV contenteditable

Вставка IMG в DIV contenteditable

Хочу вставить IMG смайлик в редактируемый DIV с учётом положения курсора, используя чистый JS (без jquery)В ходе полуторачасового поиска в интернете,...

283
Переместить метку Яндекс.Карты 2.1

Переместить метку Яндекс.Карты 2.1

ПриветствуюЕсть отличный пример по изменению координат

338