将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;
}
}