fy-convertor
Version:
Convert excel/xml/json/bin/protocl/ts/as ...
167 lines • 5.63 kB
JavaScript
// 网络字节序(大端)
export class Byte {
buffer;
data;
ubytes;
pos = 0;
backPosStack = { idx: 0, poss: [] };
constructor(buffer) {
this.buffer = buffer;
this.data = new DataView(buffer);
this.ubytes = new Uint8Array(buffer);
}
get NewBuffer() { return new Uint8Array(this.buffer, 0, this.pos); }
get UBytes() { return this.ubytes; }
get Buffer() { return this.buffer; }
get Pos() { return this.pos; }
set Pos(pos) { this.pos = pos; }
readInt8() {
return this.data.getInt8(this.pos++);
}
readInt16() {
return this.data.getInt16((this.pos += 2) - 2);
}
readInt32() {
return this.data.getInt32((this.pos += 4) - 4);
}
readInt64() {
return Number(this.data.getBigInt64((this.pos += 8) - 8, true)); // 现在服务器传来的longlong是小端
}
readUint8() {
return this.ubytes[this.pos++];
}
readUint16() {
return this.data.getUint16((this.pos += 2) - 2);
}
readUint32() {
return this.data.getUint32((this.pos += 4) - 4);
}
readUTF8String(len = 0) {
len = len || this.readUint32();
let strs = [], f = String.fromCharCode, u = this.ubytes, pos = this.pos;
let max = pos + len, c = 0, c2 = 0, c3 = 0, i = 0, n = 0, code = 0, offset = 0, lead = 0, trail = 0;
while (pos <= max) {
c = u[pos++];
if (c < 0x80) {
if (c != 0)
strs[n++] = f(c);
else
break;
}
else if (c < 0xE0) {
strs[n++] = f(((c & 0x3F) << 6) | (u[pos++] & 0x7F));
}
else if (c < 0xF0) {
c2 = u[pos++];
strs[n++] = f(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (u[pos++] & 0x7F));
}
else {
c2 = u[pos++];
c3 = u[pos++];
code = ((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 & 0x7F) << 6) | (u[pos++] & 0x7F);
if (code >= 0x10000) {
offset = code - 0x10000;
lead = 0xd800 | (offset >> 10);
trail = 0xdc00 | (offset & 0x3ff);
strs[n++] = f(lead);
strs[n++] = f(trail);
}
else {
strs[n++] = f(code);
}
}
i++;
}
this.pos = pos;
return strs.join("");
}
writeInt8(v) {
this.data.setInt8(this.pos++, v);
}
writeInt16(v) {
this.data.setInt16((this.pos += 2) - 2, v);
}
writeInt32(v) {
this.data.setInt32((this.pos += 4) - 4, v);
}
writeInt64(v) {
this.data.setBigInt64((this.pos += 8) - 8, BigInt(v), true); // 现在服务器传来的longlong是小端
}
writeUint8(v) {
this.data.setUint8(this.pos++, v);
}
writeUint16(v) {
this.data.setUint16((this.pos += 2) - 2, v);
}
writeUint32(v) {
this.data.setUint32((this.pos += 4) - 4, v);
}
writeUTF8String(str, withlen = true, withTerminateNull = true) {
str = str || "";
let spos = this.pos;
if (withlen) {
this.pos += 4; // 跳过长度部分
}
let spos2 = this.pos, pos = spos2, u = this.ubytes, c = 0, c2 = 0, p1 = 0, p2 = 0;
for (let i = 0, sz = str.length; i < sz; i++) {
c = str.charCodeAt(i);
if (c <= 0x7F) {
u[pos++] = c;
}
else if (c <= 0x7FF) {
u[pos++] = 0xC0 | (c >> 6);
u[pos++] = 0x80 | (c & 0x3F);
}
else if (c >= 0xD800 && c <= 0xDBFF) {
i++;
c2 = str.charCodeAt(i);
if (!Number.isNaN(c2) && c2 >= 0xDC00 && c2 <= 0xDFFF) {
p1 = (c & 0x3FF) + 0x40;
p2 = c2 & 0x3FF;
u[pos++] = 0xF0 | ((p1 >> 8) & 0x3F);
u[pos++] = 0x80 | ((p1 >> 2) & 0x3F);
u[pos++] = 0x80 | ((p1 & 0x3) << 4) | ((p2 >> 6) & 0xF);
u[pos++] = 0x80 | (p2 & 0x3F);
}
}
else if (c <= 0xFFFF) {
u[pos++] = 0xE0 | (c >> 12);
u[pos++] = 0x80 | ((c >> 6) & 0x3F);
u[pos++] = 0x80 | (c & 0x3F);
}
else {
u[pos++] = 0xF0 | (c >> 18);
u[pos++] = 0x80 | ((c >> 12) & 0x3F);
u[pos++] = 0x80 | ((c >> 6) & 0x3F);
u[pos++] = 0x80 | (c & 0x3F);
}
}
if (withTerminateNull) {
u[pos++] = 0;
}
let bytesLen = pos - spos2;
if (withlen) {
this.pos = spos;
this.writeUint32(bytesLen); // 回填长度
}
this.pos = pos;
return pos - spos2;
}
writeBytes(data, offset, size) {
this.ubytes.set(new Uint8Array(data, offset, size), (this.pos += size) - size);
}
skip(bytes) {
this.pos += bytes;
}
resetPos(pos) {
this.backPosStack.poss[this.backPosStack.idx++] = this.pos;
this.pos = pos;
}
restorePos() {
this.pos = this.backPosStack.poss[--this.backPosStack.idx];
}
get length() {
return this.pos;
}
}
//# sourceMappingURL=Byte.js.map