#define ZIP_DECODE_LENGTH(ptr, encoding, lensize, len) do {                    
    ZIP_ENTRY_ENCODING((ptr), (encoding));                                     
    if ((encoding) < ZIP_STR_MASK) {                                           
        if ((encoding) == ZIP_STR_06B) {                                       
            (lensize) = 1;                                                     
            (len) = (ptr)[0] & 0x3f;                                           
        } else if ((encoding) == ZIP_STR_14B) {                                
            (lensize) = 2;              //2字节情况,6位+8位存储长度                                       
            (len) = (((ptr)[0] & 0x3f) << 8) | (ptr)[1];                       
        } else if (encoding == ZIP_STR_32B) {                                  
            (lensize) = 5;             //首字节不存长度,从ptr[1]开始高位       
            (len) = ((ptr)[1] << 24) | //到低位依次计算                           
                    ((ptr)[2] << 16) |                                         
                    ((ptr)[3] <<  8) |                                         
                    ((ptr)[4]);                                                
        } else {                                                               
            assert(NULL);                                                      
        }                                                                      
    } else {                                                                   
        (lensize) = 1;                                                         
        (len) = zipIntSize(encoding);                                          
    }                                                                          
} while(0);
#define ZIP_STR_06B (0 << 6) //0000 0000
#define ZIP_STR_14B (1 << 6) //0100 0000
#define ZIP_STR_32B (2 << 6) //1000 0000

   表中为字节数组编码。上面的程序实现了表中编码向长度的转换。1字节,2字节,5字节三种。

redis压缩列表

相关文章: