Implement C# 7 varint writing/reading
This commit is contained in:
parent
bf8b3f73a6
commit
4f335421b4
7 changed files with 65 additions and 0 deletions
|
@ -82,4 +82,26 @@ export class ReaderBase {
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readVarint() {
|
||||||
|
let total = 0;
|
||||||
|
let shift = 0;
|
||||||
|
let byte = this.readUByte();
|
||||||
|
|
||||||
|
if (!(byte & 0x80)) {
|
||||||
|
return (byte & 0x7F);
|
||||||
|
} else {
|
||||||
|
let end = false;
|
||||||
|
while (!end) {
|
||||||
|
if (shift) {
|
||||||
|
byte = this.readUByte();
|
||||||
|
}
|
||||||
|
total |= ((byte & 0x7F) << shift);
|
||||||
|
end = !(byte & 0x80);
|
||||||
|
shift += 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -112,4 +112,17 @@ export class WriterBase {
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public writeVarint(value: number) {
|
||||||
|
let temp: number;
|
||||||
|
while (value > 0) {
|
||||||
|
temp = value & 0x7F;
|
||||||
|
if (!!(value >>= 7)) {
|
||||||
|
temp |= 0xB4;
|
||||||
|
}
|
||||||
|
this.writeUByte(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@ export interface IReader {
|
||||||
readUShortString(): string,
|
readUShortString(): string,
|
||||||
readShortString(): string,
|
readShortString(): string,
|
||||||
readBytesAsString(bytesToRead:number): string,
|
readBytesAsString(bytesToRead:number): string,
|
||||||
|
readVarint(): number,
|
||||||
readShort(): number,
|
readShort(): number,
|
||||||
readUShort(): number,
|
readUShort(): number,
|
||||||
readInt(): number,
|
readInt(): number,
|
||||||
|
@ -25,4 +26,6 @@ export interface IReader {
|
||||||
readShortsAsString(shortsToRead:number): string,
|
readShortsAsString(shortsToRead:number): string,
|
||||||
readUString16(): string,
|
readUString16(): string,
|
||||||
readString16(): string,
|
readString16(): string,
|
||||||
|
readArbInt(length: number): number,
|
||||||
|
readArbUInt(length: number): number,
|
||||||
}
|
}
|
|
@ -106,4 +106,16 @@ export class ReaderBE extends ReaderBase implements IReader {
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readArbInt(length: number) {
|
||||||
|
const value = this.buffer.readIntBE(this.offset, length);
|
||||||
|
this.offset += length;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public readArbUInt(length: number) {
|
||||||
|
const value = this.buffer.readUIntBE(this.offset, length);
|
||||||
|
this.offset += length;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -106,4 +106,16 @@ export class ReaderLE extends ReaderBase implements IReader {
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readArbInt(length: number) {
|
||||||
|
const value = this.buffer.readIntLE(this.offset, length);
|
||||||
|
this.offset += length;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public readArbUInt(length: number) {
|
||||||
|
const value = this.buffer.readUIntLE(this.offset, length);
|
||||||
|
this.offset += length;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@ export interface IWriter {
|
||||||
writeUByte(value:number): IWriter,
|
writeUByte(value:number): IWriter,
|
||||||
writeBool(value:boolean|number): IWriter,
|
writeBool(value:boolean|number): IWriter,
|
||||||
writeStringAsBytes(text:string): IWriter,
|
writeStringAsBytes(text:string): IWriter,
|
||||||
|
writeVarint(value: number): IWriter,
|
||||||
writeShort(value:number): IWriter,
|
writeShort(value:number): IWriter,
|
||||||
writeUShort(value:number): IWriter,
|
writeUShort(value:number): IWriter,
|
||||||
writeInt(value:number): IWriter,
|
writeInt(value:number): IWriter,
|
||||||
|
|
|
@ -173,6 +173,8 @@ export class WriterBE extends WriterBase implements IWriter {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ! TODO: Implement this properly. This was a quick, hacky implementation for mc-beta-server
|
||||||
|
// ! as it is used in one single place in the whole game's protocol.
|
||||||
public writeJavaUTF(text: string) {
|
public writeJavaUTF(text: string) {
|
||||||
const dataWriter = new WriterBE();
|
const dataWriter = new WriterBE();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue