
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
let iconv;
try { iconv = require('iconv-lite'); } catch (error) {}
class DecodeStream {
constructor(buffer) {
this.buffer = buffer;
this.pos = 0;
this.length = this.buffer.length;
}
readString(length, encoding = 'ascii') {
switch (encoding) {
case 'utf16le': case 'ucs2': case 'utf8': case 'ascii':
return this.buffer.toString(encoding, this.pos, (this.pos += length));
case 'utf16be':
var buf = Buffer.from(this.readBuffer(length));
// swap the bytes
for (let i = 0, end = buf.length - 1; i < end; i += 2) {
const byte = buf[i];
buf[i] = buf[i + 1];
buf[i + 1] = byte;
}
return buf.toString('utf16le');
default:
buf = this.readBuffer(length);
if (iconv) {
try {
return iconv.decode(buf, encoding);
} catch (error1) {}
}
return buf;
}
}
readBuffer(length) {
return this.buffer.slice(this.pos, (this.pos += length));
}
readUInt24BE() {
return (this.readUInt16BE() << 8) + this.readUInt8();
}
readUInt24LE() {
return this.readUInt16LE() + (this.readUInt8() << 16);
}
readInt24BE() {
return (this.readInt16BE() << 8) + this.readUInt8();
}
readInt24LE() {
return this.readUInt16LE() + (this.readInt8() << 16);
}
}
DecodeStream.TYPES = {
UInt8: 1,
UInt16: 2,
UInt24: 3,
UInt32: 4,
Int8: 1,
Int16: 2,
Int24: 3,
Int32: 4,
Float: 4,
Double: 8
};
for (let key in Buffer.prototype) {
if (key.slice(0, 4) === 'read') {
const bytes = DecodeStream.TYPES[key.replace(/read|[BL]E/g, '')];
DecodeStream.prototype[key] = function() {
const ret = this.buffer[key](this.pos);
this.pos += bytes;
return ret;
};
}
}
module.exports = DecodeStream;