bitCount
만큼 bit 들을 추출합니다. 결과는 Uint32
크기를 가진 정수입니다. 이는 C++ 과 달리 JS 는 >>
연산자가 32-bit 정수에만 정의되기 때문입니다. 만약 a >> 40
처럼 하게 되면, 우측 피연산자 40
은 $32$ 로 나눈 나머지가 되어 a >> 8
이라는 잘못된 결과가 나오게 됩니다.
주소값을 매길 수 있는 최소 단위는 $byte$ 이므로, 1-bit 를 읽기 위해서는 1-byte 를 읽고 비트 연산자를 통해 사용하지 않을 7-bits 는 걸러내야 합니다. 이때 읽지 않은 bit 들은 내부 버퍼에 버퍼링(buffering)됩니다.
BitStream
은 항상 최소한의 바이트들을 읽어, zlib-data stream 을 읽은 이후의 작업에 영향을 미치지 않도록 합니다. 예를 들어 현재 버퍼링된 bit 들이 없는 상태에서 12-bits 를 읽어야 한다면, FileStream
으로부터 항상 2-byte 를 읽어온다는 의미입니다.
PNG 파일을 읽기 위해 생성자 BitStream() 에 idatChunk
인자를 전달했다면, IDAT 청크들의 경계를 자동으로 처리해줍니다.
bin.read(bitCount)
bitCount
추출할 bit 들의 갯수를 나타내는 number
. 내부 버퍼의 크기는 $32$ 가 최대이므로, 항상 bitCount
의 범위는 $[0, 32]$ 이어야 합니다.
읽어들인 bits 들이 담긴 number
. 항상 32-bit unsigend integer 를 나타냅니다.
// uint8Array
// 0 1 2
// +--------+--------+--------+
// |11101111|11100001| 01|
// +--------+--------+--------+
//
const uint8Array = new Uint8Array([0xef, 0xe1, 0x01]);
const bin = new BitStream(new FileStream(uint8Array));
const result0 = bin.read(5); // 0xf
const result1 = bin.read(13); // 0x0f0f
console.log(result0.toString(16), result1.toString(16)); // f f0f