@@ -63,6 +63,82 @@ function boundsError(value, length, type) {
6363}
6464
6565// Read integers.
66+ function readBigUInt64LE(offset = 0) {
67+ validateNumber(offset, 'offset');
68+ const first = this[offset];
69+ const last = this[offset + 7];
70+ if (first === undefined || last === undefined)
71+ boundsError(offset, this.length - 8);
72+
73+ const lo = first +
74+ this[++offset] * 2 ** 8 +
75+ this[++offset] * 2 ** 16 +
76+ this[++offset] * 2 ** 24;
77+
78+ const hi = this[++offset] +
79+ this[++offset] * 2 ** 8 +
80+ this[++offset] * 2 ** 16 +
81+ last * 2 ** 24;
82+
83+ return BigInt(lo) + (BigInt(hi) << 32n);
84+ }
85+
86+ function readBigUInt64BE(offset = 0) {
87+ validateNumber(offset, 'offset');
88+ const first = this[offset];
89+ const last = this[offset + 7];
90+ if (first === undefined || last === undefined)
91+ boundsError(offset, this.length - 8);
92+
93+ const hi = first * 2 ** 24 +
94+ this[++offset] * 2 ** 16 +
95+ this[++offset] * 2 ** 8 +
96+ this[++offset];
97+
98+ const lo = this[++offset] * 2 ** 24 +
99+ this[++offset] * 2 ** 16 +
100+ this[++offset] * 2 ** 8 +
101+ last;
102+
103+ return (BigInt(hi) << 32n) + BigInt(lo);
104+ }
105+
106+ function readBigInt64LE(offset = 0) {
107+ validateNumber(offset, 'offset');
108+ const first = this[offset];
109+ const last = this[offset + 7];
110+ if (first === undefined || last === undefined)
111+ boundsError(offset, this.length - 8);
112+
113+ const val = this[offset + 4] +
114+ this[offset + 5] * 2 ** 8 +
115+ this[offset + 6] * 2 ** 16 +
116+ (last << 24); // Overflow
117+ return (BigInt(val) << 32n) +
118+ BigInt(first +
119+ this[++offset] * 2 ** 8 +
120+ this[++offset] * 2 ** 16 +
121+ this[++offset] * 2 ** 24);
122+ }
123+
124+ function readBigInt64BE(offset = 0) {
125+ validateNumber(offset, 'offset');
126+ const first = this[offset];
127+ const last = this[offset + 7];
128+ if (first === undefined || last === undefined)
129+ boundsError(offset, this.length - 8);
130+
131+ const val = (first << 24) + // Overflow
132+ this[++offset] * 2 ** 16 +
133+ this[++offset] * 2 ** 8 +
134+ this[++offset];
135+ return (BigInt(val) << 32n) +
136+ BigInt(this[++offset] * 2 ** 24 +
137+ this[++offset] * 2 ** 16 +
138+ this[++offset] * 2 ** 8 +
139+ last);
140+ }
141+
66142function readUIntLE(offset, byteLength) {
67143 if (offset === undefined)
68144 throw new ERR_INVALID_ARG_TYPE('offset', 'number', offset);
@@ -473,6 +549,68 @@ function readDoubleForwards(offset = 0) {
473549}
474550
475551// Write integers.
552+ function writeBigU_Int64LE(buf, value, offset, min, max) {
553+ checkInt(value, min, max, buf, offset, 7);
554+
555+ let lo = Number(value & 0xffffffffn);
556+ buf[offset++] = lo;
557+ lo = lo >> 8;
558+ buf[offset++] = lo;
559+ lo = lo >> 8;
560+ buf[offset++] = lo;
561+ lo = lo >> 8;
562+ buf[offset++] = lo;
563+ let hi = Number(value >> 32n & 0xffffffffn);
564+ buf[offset++] = hi;
565+ hi = hi >> 8;
566+ buf[offset++] = hi;
567+ hi = hi >> 8;
568+ buf[offset++] = hi;
569+ hi = hi >> 8;
570+ buf[offset++] = hi;
571+ return offset;
572+ }
573+
574+ function writeBigUInt64LE(value, offset = 0) {
575+ return writeBigU_Int64LE(this, value, offset, 0n, 0xffffffffffffffffn);
576+ }
577+
578+ function writeBigU_Int64BE(buf, value, offset, min, max) {
579+ checkInt(value, min, max, buf, offset, 7);
580+
581+ let lo = Number(value & 0xffffffffn);
582+ buf[offset + 7] = lo;
583+ lo = lo >> 8;
584+ buf[offset + 6] = lo;
585+ lo = lo >> 8;
586+ buf[offset + 5] = lo;
587+ lo = lo >> 8;
588+ buf[offset + 4] = lo;
589+ let hi = Number(value >> 32n & 0xffffffffn);
590+ buf[offset + 3] = hi;
591+ hi = hi >> 8;
592+ buf[offset + 2] = hi;
593+ hi = hi >> 8;
594+ buf[offset + 1] = hi;
595+ hi = hi >> 8;
596+ buf[offset] = hi;
597+ return offset + 8;
598+ }
599+
600+ function writeBigUInt64BE(value, offset = 0) {
601+ return writeBigU_Int64BE(this, value, offset, 0n, 0xffffffffffffffffn);
602+ }
603+
604+ function writeBigInt64LE(value, offset = 0) {
605+ return writeBigU_Int64LE(
606+ this, value, offset, -0x8000000000000000n, 0x7fffffffffffffffn);
607+ }
608+
609+ function writeBigInt64BE(value, offset = 0) {
610+ return writeBigU_Int64BE(
611+ this, value, offset, -0x8000000000000000n, 0x7fffffffffffffffn);
612+ }
613+
476614function writeUIntLE(value, offset, byteLength) {
477615 if (byteLength === 6)
478616 return writeU_Int48LE(this, value, offset, 0, 0xffffffffffff);
@@ -790,6 +928,15 @@ function writeFloatBackwards(val, offset = 0) {
790928class FastBuffer extends Uint8Array {}
791929
792930function addBufferPrototypeMethods(proto) {
931+ proto.readBigUInt64LE = readBigUInt64LE,
932+ proto.readBigUInt64BE = readBigUInt64BE,
933+ proto.readBigInt64LE = readBigInt64LE,
934+ proto.readBigInt64BE = readBigInt64BE,
935+ proto.writeBigUInt64LE = writeBigUInt64LE,
936+ proto.writeBigUInt64BE = writeBigUInt64BE,
937+ proto.writeBigInt64LE = writeBigInt64LE,
938+ proto.writeBigInt64BE = writeBigInt64BE,
939+
793940 proto.readUIntLE = readUIntLE;
794941 proto.readUInt32LE = readUInt32LE;
795942 proto.readUInt16LE = readUInt16LE;
0 commit comments