import { _decorator, Component, Node } from 'cc'; const { ccclass, property } = _decorator; @ccclass('ReadStream') export class ReadStream { Buffer: Uint8Array; //当前读取位置 Pos: number = 0; constructor(public buffer: Uint8Array) { this.Buffer = buffer; } //string转字节数组 static StringToUint8Array(str) { const encoder = new TextEncoder(); return encoder.encode(str); } //字节数组转string static Uint8ArrayToString(data: Uint8Array): string { const decoder = new TextDecoder(); // 默认使用 'utf-8' 编码 return decoder.decode(data); } Seekg(Pos: number) { this.Pos = Pos; } //读取数字 默认小端序读取 GetShort(littleEndian: boolean = true) { //读2个字节 const Buf = new DataView(this.GetBufferByLength(2).buffer); const view = new DataView(Buf.buffer); return Number(view.getInt16(0, true)); } GetUShort(littleEndian: boolean = true) { //读2个字节 const Buf = new DataView(this.GetBufferByLength(2).buffer); const view = new DataView(Buf.buffer); return Number(view.getUint16(0, true)); } //读取数字 默认小端序读取 GetInt(littleEndian: boolean = true) { //读4个字节 const Buf = new DataView(this.GetBufferByLength(4).buffer); return Buf.getInt32(0, littleEndian); } //读取浮点数 默认小端序读取 GetFloat(littleEndian: boolean = true) { //读4个字节 const Buf = new DataView(this.GetBufferByLength(4).buffer); return Buf.getFloat32(0, littleEndian); } //特殊方法 Get256(): any { const Buf = Number(this.GetBufferByLength(1)); return (256.0 + Buf) % 256.0; } //读取数字 默认小端序 GetLongInt(littleEndian: boolean = true) { //读8个字节 const Buf = this.GetBufferByLength(8); const view = new DataView(Buf.buffer); return Number(view.getBigInt64(0, true)); } //读取字符串 GetString(Length?: number) { if (Length) { //读指定字节 const Buf = this.GetBufferByLength(Length); return ReadStream.Uint8ArrayToString(Buf); } else { for (let i = 0; i < this.Buffer.length - this.Pos; i++) { if (this.Buffer[i + this.Pos] == 0) { const truncatedArray = this.Buffer.subarray(this.Pos, i + this.Pos); this.Pos += i + 1; return ReadStream.Uint8ArrayToString(truncatedArray); } } } } //读取指定长度流 GetBufferByLength(Length: number) { const Buf = this.Buffer.slice(this.Pos, this.Pos + Length); this.Pos += Length; return Buf; } //读取信息 通过Key ReadInfo(Key): string { let PathUA: Uint8Array = new Uint8Array(256); for (let i = 0; i < 256; i++) { PathUA[i] = this.Buffer[i + this.Pos] ^ Key[i]; } // let Spos = 0; // for (let i = 0; i < PathUA.length; i++) { // if (PathUA[i] == 0) Spos = i; // } // const truncatedArray = PathUA.subarray(0, Spos); this.Pos += 256; let str = ReadStream.Uint8ArrayToString(PathUA); str = str.substring(0, str.indexOf(".img") + 4); return str; } len() { return this.Buffer.length; } }