From 961df8cd721b1fb49c152ce60c2e387036e1aa24 Mon Sep 17 00:00:00 2001 From: Holly Date: Mon, 1 Jan 2024 22:23:16 +0000 Subject: [PATCH] Add functions for reading/writing strings without lengths --- base/ReaderBase.ts | 21 +++++++++++++++++++++ base/WriterBase.ts | 15 +++++++++++++++ readers/IReader.ts | 4 +++- readers/ReaderBE.ts | 25 ++++++++++++------------- readers/ReaderLE.ts | 21 ++++++++++----------- writers/IWriter.ts | 4 +++- writers/WriterBE.ts | 15 +++++++++++++++ writers/WriterLE.ts | 15 +++++++++++++++ 8 files changed, 94 insertions(+), 26 deletions(-) diff --git a/base/ReaderBase.ts b/base/ReaderBase.ts index eb08d1d..bd5ece0 100644 --- a/base/ReaderBase.ts +++ b/base/ReaderBase.ts @@ -50,4 +50,25 @@ export class ReaderBase { public readBool() { return Boolean(this.readUByte()); } + + public readShortString() { + const length = this.readUByte(); + let text = ""; + + for (let i = 0; i < length; i++) { + text += String.fromCharCode(this.readUByte()); + } + + return text; + } + + public readBytesAsString(bytesToRead:number) { + let text = ""; + + for (let i = 0; i < bytesToRead; i++) { + text += String.fromCharCode(this.readUByte()); + } + + return text; + } } \ No newline at end of file diff --git a/base/WriterBase.ts b/base/WriterBase.ts index b9b0436..e568e20 100644 --- a/base/WriterBase.ts +++ b/base/WriterBase.ts @@ -76,4 +76,19 @@ export class WriterBase { return this; } + + public writeStringAsBytes(text:string) { + let buffer; + if (this.resizable) { + buffer = getBufferClass().alloc(text.length); + } else { + buffer = this.buffer; + } + + for (let i = 0; i < text.length; i++) { + buffer.writeUInt8(text.charCodeAt(i), i); + } + + return this; + } } \ No newline at end of file diff --git a/readers/IReader.ts b/readers/IReader.ts index eec30ac..e8a5cf0 100644 --- a/readers/IReader.ts +++ b/readers/IReader.ts @@ -9,6 +9,8 @@ export interface IReader { readByte(): number, readUByte(): number, readBool(): boolean, + readShortString(): string, + readBytesAsString(bytesToRead:number): string, readShort(): number, readUShort(): number, readInt(): number, @@ -17,7 +19,7 @@ export interface IReader { readULong(): bigint, readFloat(): number, readDouble(): number, - readShortString(): string, readString(): string, + readShortsAsString(shortsToRead:number): string, readString16(): string, } \ No newline at end of file diff --git a/readers/ReaderBE.ts b/readers/ReaderBE.ts index b8a276d..6125967 100644 --- a/readers/ReaderBE.ts +++ b/readers/ReaderBE.ts @@ -53,20 +53,9 @@ export class ReaderBE extends ReaderBase implements IReader { return value; } - public readShortString() { - const length = this.readUByte(); - let text:string = ""; - - for (let i = 0; i < length; i++) { - text += String.fromCharCode(this.readUByte()); - } - - return text; - } - public readString() { const length = this.readUShort(); - let text:string = ""; + let text = ""; for (let i = 0; i < length; i++) { text += String.fromCharCode(this.readUByte()); @@ -77,7 +66,7 @@ export class ReaderBE extends ReaderBase implements IReader { public readString16() { const length = this.readUShort(); - let text:string = ""; + let text = ""; for (let i = 0; i < length; i++) { text += String.fromCharCode(this.readUShort()); @@ -85,4 +74,14 @@ export class ReaderBE extends ReaderBase implements IReader { return text; } + + public readShortsAsString(shortsToRead:number) { + let text = ""; + + for (let i = 0; i < shortsToRead; i++) { + text += String.fromCharCode(this.readUShort()); + } + + return text; + } } \ No newline at end of file diff --git a/readers/ReaderLE.ts b/readers/ReaderLE.ts index ea10c3d..0f224b7 100644 --- a/readers/ReaderLE.ts +++ b/readers/ReaderLE.ts @@ -53,17 +53,6 @@ export class ReaderLE extends ReaderBase implements IReader { return value; } - public readShortString() { - const length = this.readUByte(); - let text:string = ""; - - for (let i = 0; i < length; i++) { - text += String.fromCharCode(this.readUByte()); - } - - return text; - } - public readString() { const length = this.readUShort(); let text:string = ""; @@ -85,4 +74,14 @@ export class ReaderLE extends ReaderBase implements IReader { return text; } + + public readShortsAsString(shortsToRead:number) { + let text = ""; + + for (let i = 0; i < shortsToRead; i++) { + text += String.fromCharCode(this.readUShort()); + } + + return text; + } } \ No newline at end of file diff --git a/writers/IWriter.ts b/writers/IWriter.ts index 1bd2250..dd98088 100644 --- a/writers/IWriter.ts +++ b/writers/IWriter.ts @@ -11,15 +11,17 @@ export interface IWriter { writeByte(value:number): IWriter, writeUByte(value:number): IWriter, writeBool(value:boolean|number): IWriter, + writeStringAsBytes(text:string): IWriter, writeShort(value:number): IWriter, writeUShort(value:number): IWriter, writeInt(value:number): IWriter, writeUInt(value:number): IWriter, writeLong(value:number|bigint): IWriter, - writeULong(value:number): IWriter, + writeULong(value:number|bigint): IWriter, writeFloat(value:number): IWriter, writeDouble(value:number): IWriter, writeShortString(text:string): IWriter, writeString(text:string): IWriter, writeString16(text:string): IWriter, + writeStringAsShorts(text:string): IWriter } \ No newline at end of file diff --git a/writers/WriterBE.ts b/writers/WriterBE.ts index eede3e7..171e6a0 100644 --- a/writers/WriterBE.ts +++ b/writers/WriterBE.ts @@ -147,4 +147,19 @@ export class WriterBE extends WriterBase implements IWriter { return this; } + + public writeStringAsShorts(text:string) { + let buffer:Buffer; + if (this.resizable) { + buffer = getBufferClass().alloc(text.length * 2); + } else { + buffer = this.buffer; + } + + for (let i = 0; i < text.length; i++) { + buffer.writeUint16BE(text.charCodeAt(i), i); + } + + return this; + } } \ No newline at end of file diff --git a/writers/WriterLE.ts b/writers/WriterLE.ts index 61d9b77..0759f3a 100644 --- a/writers/WriterLE.ts +++ b/writers/WriterLE.ts @@ -146,4 +146,19 @@ export class WriterLE extends WriterBase implements IWriter { return this; } + + public writeStringAsShorts(text:string) { + let buffer:Buffer; + if (this.resizable) { + buffer = getBufferClass().alloc(text.length * 2); + } else { + buffer = this.buffer; + } + + for (let i = 0; i < text.length; i++) { + buffer.writeUint16LE(text.charCodeAt(i), i); + } + + return this; + } } \ No newline at end of file