将longlong类型的value编码成一个整数编码。
#define RDB_ENC_INT8 0 /* 8位有符号整数 8 bit signed integer */ #define RDB_ENC_INT16 1 /* 16位有符号整数 16 bit signed integer */ #define RDB_ENC_INT32 2 /* 32位有符号整数 32 bit signed integer */ #define RDB_ENC_LZF 3 /* LZF压缩过的字符串 string compressed with FASTLZ */ /* Encodes the "value" argument as integer when it fits in the supported ranges * for encoded types. If the function successfully encodes the integer, the * representation is stored in the buffer pointer to by "enc" and the string * length is returned. Otherwise 0 is returned. */ // 将longlong类型的value编码成一个整数编码,如果可以编码,将编码后的值保存在enc中,返回编码后的字节数 int rdbEncodeInteger(long long value, unsigned char *enc) { // -2^8 <= value <= 2^8-1 // 最高两位设置为 11,表示是一个编码过的值,低6位为 000000 ,表示是 RDB_ENC_INT8 编码格式 // 剩下的1个字节保存value,返回2字节 if (value >= -(1<<7) && value <= (1<<7)-1) { enc[0] = (RDB_ENCVAL<<6)|RDB_ENC_INT8; enc[1] = value&0xFF; return 2; // -2^16 <= value <= 2^16-1 // 最高两位设置为 11,表示是一个编码过的值,低6位为 000001 ,表示是 RDB_ENC_INT16 编码格式 // 剩下的2个字节保存value,返回3字节 } else if (value >= -(1<<15) && value <= (1<<15)-1) { enc[0] = (RDB_ENCVAL<<6)|RDB_ENC_INT16; enc[1] = value&0xFF; enc[2] = (value>>8)&0xFF; return 3; // -2^32 <= value <= 2^32-1 // 最高两位设置为 11,表示是一个编码过的值,低6位为 000010 ,表示是 RDB_ENC_INT32 编码格式 // 剩下的4个字节保存value,返回5字节 } else if (value >= -((long long)1<<31) && value <= ((long long)1<<31)-1) { enc[0] = (RDB_ENCVAL<<6)|RDB_ENC_INT32; enc[1] = value&0xFF; enc[2] = (value>>8)&0xFF; enc[3] = (value>>16)&0xFF; enc[4] = (value>>24)&0xFF; return 5; } else { return 0; } }