yunsi-toolbox-vue/lib/shared/binary-writer.ts

51 lines
1.7 KiB
TypeScript

// ── Little-endian write helpers ────────────────────────────────────
export function writeU8(buf: Uint8Array, off: number, val: number) {
buf[off] = val & 0xFF;
}
export function writeU16(buf: Uint8Array, off: number, val: number) {
buf[off] = val & 0xFF;
buf[off + 1] = (val >> 8) & 0xFF;
}
export function writeU32(buf: Uint8Array, off: number, val: number) {
buf[off] = val & 0xFF;
buf[off + 1] = (val >> 8) & 0xFF;
buf[off + 2] = (val >> 16) & 0xFF;
buf[off + 3] = (val >> 24) & 0xFF;
}
export function writeI8(buf: Uint8Array, off: number, val: number) {
buf[off] = val < 0 ? val + 256 : val;
}
export function writeI16(buf: Uint8Array, off: number, val: number) {
const u = val < 0 ? val + 65536 : val;
writeU16(buf, off, u);
}
export function writeI32(buf: Uint8Array, off: number, val: number) {
writeU32(buf, off, val < 0 ? val + 0x100000000 : val);
}
export function writeU64(buf: Uint8Array, off: number, val: bigint) {
const lo = Number(val & 0xFFFFFFFFn);
const hi = Number((val >> 32n) & 0xFFFFFFFFn);
writeU32(buf, off, lo);
writeU32(buf, off + 4, hi);
}
export function writeI64(buf: Uint8Array, off: number, val: bigint) {
const u = val < 0n ? val + 0x10000000000000000n : val;
writeU64(buf, off, u);
}
/** Write null-terminated ASCII string padded to `fieldSize` bytes */
export function writeNullTermString(buf: Uint8Array, off: number, str: string, fieldSize: number) {
buf.fill(0, off, off + fieldSize);
const encoder = new TextEncoder();
const strBytes = encoder.encode(str);
buf.set(strBytes.subarray(0, fieldSize - 1), off); // leave room for null
}