/** * 写字节流工具 */ import type { Uint8ArrayInterface, BytesWriter } from "./interface.ts"; export default class IOWriter implements BytesWriter { private data; private buffer; private pointer; private pos; private size; private littleEndian; error: number; onFlush: (data: Uint8Array, pos?: bigint) => Promise; onSeek: (seek: bigint) => Promise; /** * @param data 待写的 Uint8Array * @param bigEndian 是否按大端字节序写,默认大端字节序(网络字节序) */ constructor(size?: number, bigEndian?: boolean, map?: Uint8ArrayInterface); /** * 写 8 位无符号整数 */ writeUint8(value: number): Promise; /** * 读取 16 位无符号整数 */ writeUint16(value: number): Promise; /** * 写 24 位无符号整数 */ writeUint24(value: number): Promise; /** * 写 32 位无符号整数 */ writeUint32(value: number): Promise; /** * 写 64 位无符号整数 */ writeUint64(value: bigint): Promise; /** * 写 8 位有符号整数 * * @returns */ writeInt8(value: number): Promise; /** * 写 16 位有符号整数 */ writeInt16(value: number): Promise; /** * 写 24 位有符号整数 */ writeInt24(value: number): Promise; /** * 写 32 位有符号整数 */ writeInt32(value: number): Promise; /** * 写 64 位有符号整数 */ writeInt64(value: bigint): Promise; /** * 写单精度浮点数 * * @returns */ writeFloat(value: number): Promise; /** * 写双精度浮点数 */ writeDouble(value: number): Promise; /** * 获取当前写指针 * * @returns */ getPointer(): number; getPos(): bigint; /** * 获取剩余可写节数 * * @returns */ remainingLength(): number; /** * 写指定长度的二进制 buffer 数据 * * @param length * @returns */ writeBuffer(buffer: Uint8ArrayInterface): Promise; /** * 写一个字符串 */ writeString(str: string): Promise; /** * 将缓冲区中数据写出 */ flush(): Promise; /** * 将缓冲区中数据写出到指定位置 * * @param pos */ flushToPos(pos: bigint): Promise; /** * seek 到指定位置 * * @param pos */ seek(pos: bigint): Promise; /** * 在当前缓冲区映射区间内 seek * * @param pos */ seekInline(pos: number): void; /** * 跳过指定长度 * * @param length */ skip(length: number): void; /** * 回退指定长度,不能大于 pointer 大小 * * @param length */ back(length: number): void; /** * 获取缓冲区 * * @returns */ getBuffer(): Uint8Array; /** * 设置读取是小端还是大端 * * @param bigEndian */ setEndian(bigEndian: boolean): void; /** * 重置 writer */ reset(): void; /** * 获取缓冲区长度 * * @returns */ getBufferSize(): number; }