128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
|  | 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; | ||
|  |     } | ||
|  | 
 | ||
|  | } |