33 lines
870 B
JavaScript
33 lines
870 B
JavaScript
const { crc } = require('node-crc');
|
|
|
|
const CRC_TABLE = new Uint32Array(256);
|
|
for (let i = 0; i < 256; i++) {
|
|
let r = i << 24;
|
|
for (let j = 0; j < 8; j++) {
|
|
r = (r & 0x80000000) !== 0 ? ((r << 1) ^ 0x04c11db7) : (r << 1);
|
|
}
|
|
CRC_TABLE[i] = (r >>> 0);
|
|
}
|
|
|
|
function calculateOggCrc(buffer) {
|
|
let crc = 0;
|
|
for (let i = 0; i < buffer.length; i++) {
|
|
crc = ((crc << 8) >>> 0) ^ CRC_TABLE[((crc >>> 24) ^ buffer[i]) & 0xff];
|
|
crc >>>= 0;
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
const testBuffer = Buffer.from("hello world this is a test page", "utf-8");
|
|
|
|
const expectedBuffer = crc(32, false, 0x04c11db7, 0, 0, 0, 0, 0, testBuffer);
|
|
const expected = expectedBuffer.readUInt32BE(0);
|
|
|
|
const actual = calculateOggCrc(testBuffer);
|
|
|
|
console.log({
|
|
expected: expected.toString(16),
|
|
actual: actual.toString(16),
|
|
match: expected === actual
|
|
});
|