redis代码-rdbEncodeInteger——longlong转整数,按字节存longlong型数值

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值