Доброго времени суток. Решил переписать один алгоритм с 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;
}
bitPtr - это не функция а переменная, в которой хранится в каком конкретно бите вы сейчас находитесь...это порядковый номер бита. Переменная соответственно хранит значения от 0 до 7.
Читайте исходники библиотек, которыми Вы пользуетесь: https://github.com/codedread/bitjs/blob/master/io/bitstream.js#L36
Сборка персонального компьютера от Artline: умный выбор для современных пользователей