proto.writeLong = function (val) { if (typeof val !== 'number' && utility.isSafeNumberString(val)) { val = Number(val); } if (val >= -8 && val <= 15) { this.byteBuffer.put(val + 0xe0); } else if (val >= -2048 && val <= 2047) { var b0 = val & 0xff; var code = (val >> 8) + 0xf8; this.byteBuffer.put(code).put(b0); } else if (val >= -262144 && val <= 262143) { var b1b0 = val & 0xffff; var code = (val >> 16) + 0x3c; this.byteBuffer.put(code).putUInt16(b1b0); } else if (val >= -0x80000000 && val <= 0x7fffffff) { // 32-bit integer cast to long this.byteBuffer.put(0x59).putInt32(val); } else { this.byteBuffer .put(0x4c) // 'L' .putLong(val); } return this; };
ByteBuffer.prototype.putLong = function (index, value) { // long // int, long var offset = 0; if (value === undefined) { // long offset = this._offset; this._offset += 8; this._checkSize(this._offset); value = index; } else { // int, long offset = index; } // get the offset var highOffset = offset; var lowOffset = offset + 4; if (this._order !== BIG_ENDIAN) { highOffset = offset + 4; lowOffset = offset; } var isNumber = typeof value === 'number'; // convert safe number string to number if (!isNumber && utility.isSafeNumberString(value)) { isNumber = true; value = Number(value); } // int if (isNumber && value < MAX_INT_31 && value >= -MAX_INT_31) { // put high value < 0 ? this._putFF(highOffset) : this._putZero(highOffset); if (this._order === BIG_ENDIAN) { this._bytes.writeInt32BE(value, lowOffset); } else { this._bytes.writeInt32LE(value, lowOffset); } return this; } // long number or string, make it a Long Object // TODO: Long object's performence has big problem if (typeof value.low !== 'number' || typeof value.high !== 'number') { // not Long instance, must be Number or String value = isNumber ? Long.fromNumber(value) : Long.fromString(value); } // write if (this._order === BIG_ENDIAN) { this._bytes.writeInt32BE(value.high, highOffset); this._bytes.writeInt32BE(value.low, lowOffset); } else { this._bytes.writeInt32LE(value.high, highOffset); this._bytes.writeInt32LE(value.low, lowOffset); } return this; };