@phi-ag/rvt
Version:
Parse Revit file format
52 lines (51 loc) • 2.17 kB
JavaScript
import { assertEqual, assertZero } from "./utils.js";
export const maxFatSectorsHeader = 109;
export const parseHeader = (chunk) => {
const signature = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];
assertEqual(chunk, 0, signature, "signature");
assertEqual(chunk, 24, [0x3e, 0x00], "minor version");
const view = new DataView(chunk.buffer, chunk.byteOffset);
const version = view.getUint16(26, true);
if (version !== 3 && version !== 4)
throw Error(`Unexpected compound file major version (${version})`);
assertEqual(chunk, 28, [0xfe, 0xff], "byte order");
const sectorSizeBits = view.getUint16(30, true);
const sectorSize = 1 << sectorSizeBits;
const maxSectorEntries = 1 << (sectorSizeBits - 2);
const miniSectorSizeBits = view.getUint16(32, true);
const miniSectorSize = 1 << miniSectorSizeBits;
assertZero(chunk, 34, 6, "reserved");
const directorySectorCount = view.getUint32(40, true);
if (version === 3 && directorySectorCount !== 0)
throw Error(`Unexpected compound file sector count (${directorySectorCount})`);
const fatSectorCount = view.getUint32(44, true);
const directoryStart = view.getUint32(48, true);
assertZero(chunk, 52, 4, "transaction signature");
const miniFatCutoff = view.getUint32(56, true);
const miniFatStart = view.getUint32(60, true);
const miniFatSectorCount = view.getUint32(64, true);
const diFatStart = view.getUint32(68, true);
const diFatCount = view.getUint32(72, true);
const fatSectors = new Uint32Array(fatSectorCount);
const fatSectorsHeaderCount = Math.min(fatSectorCount, maxFatSectorsHeader);
for (let i = 0; i < fatSectorsHeaderCount; ++i) {
fatSectors[i] = view.getUint32(76 + i * 4, true);
}
const header = {
version,
sectorSize,
sectorSizeBits,
maxSectorEntries,
miniSectorSize,
miniSectorSizeBits,
directorySectorCount,
fatSectorCount,
directoryStart,
miniFatCutoff,
miniFatStart,
miniFatSectorCount,
diFatStart,
diFatCount
};
return [header, fatSectors];
};