in hugegraph-client/src/main/java/org/apache/hugegraph/serializer/direct/util/BytesBuffer.java [586:651]
private void writeNumber(long val) {
/*
* 8 kinds of number, 2 ~ 9 bytes number:
* 0b 0kkksxxx X...
* 0(1 bit) + kind(3 bits) + signed(1 bit) + number(n bits)
*
* 2 byte : 0b 0000 1xxx X(8 bits) [0, 2047]
* 0b 0000 0xxx X(8 bits) [-2048, -1]
* 3 bytes: 0b 0001 1xxx X X [0, 524287]
* 0b 0001 0xxx X X [-524288, -1]
* 4 bytes: 0b 0010 1xxx X X X [0, 134217727]
* 0b 0010 0xxx X X X [-134217728, -1]
* 5 bytes: 0b 0011 1xxx X X X X [0, 2^35 - 1]
* 0b 0011 0xxx X X X X [-2^35, -1]
* 6 bytes: 0b 0100 1xxx X X X X X [0, 2^43 - 1]
* 0b 0100 0xxx X X X X X [-2^43, -1]
* 7 bytes: 0b 0101 1xxx X X X X X X [0, 2^51 - 1]
* 0b 0101 0xxx X X X X X X [-2^51, -1]
* 8 bytes: 0b 0110 1xxx X X X X X X X [0, 2^59 - 1]
* 0b 0110 0xxx X X X X X X X [-2^59, -1]
* 9 bytes: 0b 0111 1000 X X X X X X X X [0, 2^64 - 1]
* 0b 0111 0000 X X X X X X X X [-2^64, -1]
*
* NOTE: 0b 0111 1111 is used by 128 bits UUID
* 0b 0111 1110 is used by EdgeId
*/
int positive = val >= 0 ? 0x08 : 0x00;
if (~0x7ffL <= val && val <= 0x7ffL) {
int high3bits = (int) (val >> 8) & 0x07;
this.writeUInt8(0x00 | positive | high3bits);
this.writeUInt8((byte) val);
} else if (~0x7ffffL <= val && val <= 0x7ffffL) {
int high3bits = (int) (val >> 16) & 0x07;
this.writeUInt8(0x10 | positive | high3bits);
this.writeShort((short) val);
} else if (~0x7ffffffL <= val && val <= 0x7ffffffL) {
int high3bits = (int) (val >> 24 & 0x07);
this.writeUInt8(0x20 | positive | high3bits);
this.write((byte) (val >> 16));
this.writeShort((short) val);
} else if (~0x7ffffffffL <= val && val <= 0x7ffffffffL) {
int high3bits = (int) (val >> 32) & 0x07;
this.writeUInt8(0x30 | positive | high3bits);
this.writeInt((int) val);
} else if (~0x7ffffffffffL <= val && val <= 0x7ffffffffffL) {
int high3bits = (int) (val >> 40) & 0x07;
this.writeUInt8(0x40 | positive | high3bits);
this.write((byte) (val >> 32));
this.writeInt((int) val);
} else if (~0x7ffffffffffffL <= val && val <= 0x7ffffffffffffL) {
int high3bits = (int) (val >> 48) & 0x07;
this.writeUInt8(0x50 | positive | high3bits);
this.writeShort((short) (val >> 32));
this.writeInt((int) val);
} else if (~0x7ffffffffffffffL <= val && val <= 0x7ffffffffffffffL) {
int high3bits = (int) (val >> 56) & 0x07;
this.writeUInt8(0x60 | positive | high3bits);
this.write((byte) (val >> 48));
this.writeShort((short) (val >> 32));
this.writeInt((int) val);
} else {
// high3bits is always 0b000 for 9 bytes number
this.writeUInt8(0x70 | positive);
this.writeLong(val);
}
}