DaFuWeng/assets/GlobalScript/Tool/ReadStream.ts

128 lines
3.5 KiB
TypeScript
Raw Normal View History

2024-03-06 22:06:49 +08:00
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;
}
}