51 lines
1.7 KiB
TypeScript
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
|
|
}
|