设为首页 加入收藏

TOP

leveldb学习:Memtable和Varint(二)
2015-11-21 01:42:03 来源: 作者: 【 】 浏览:1
Tags:leveldb 学习 Memtable Varint
4字节的int型最多需要5字节用varint表示。
有关varint的编码和解码部分实现都在coding.cc中。

int VarintLength(uint64_t v) { int len = 1; while (v >= 128) { v >>= 7; len++; } return len; }

编码:

char* EncodeVarint32(char* dst, uint32_t v) { // Operate on characters as unsigneds unsigned char* ptr = reinterpret_cast
       
        (dst); static const int B = 128; if (v < (1<<7)) { *(ptr++) = v; } else if (v < (1<<14)) { *(ptr++) = v | B; *(ptr++) = v>>7; } else if (v < (1<<21)) { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = v>>14; } else if (v < (1<<28)) { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = (v>>14) | B; *(ptr++) = v>>21; } else { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = (v>>14) | B; *(ptr++) = (v>>21) | B; *(ptr++) = v>>28; } return reinterpret_cast
        
         (ptr); }
        
       

解码:

inline const char* GetVarint32Ptr(const char* p, const char* limit, uint32_t* value) { if (p < limit) { uint32_t result = *(reinterpret_cast
        
         (p)); if ((result & 128) == 0) { *value = result; return p + 1; } } return GetVarint32PtrFallback(p, limit, value); } const char* GetVarint32PtrFallback(const char* p, const char* limit, uint32_t* value) { uint32_t result = 0; for (uint32_t shift = 0; shift <= 28 && p < limit; shift += 7) { uint32_t byte = *(reinterpret_cast
         
          (p)); p++; if (byte & 128) { // More bytes are present result |= ((byte & 127) << shift); } else { result |= (byte << shift); *value = result; return reinterpret_cast
          
           (p); } } return NULL; }
          
         
        

没什么可说的,用心体会里面的移位操作。

看完32位int转varint,来看看进阶版64位int的编码和解码,里面采用了循环结构

char* EncodeVarint64(char* dst, uint64_t v) { static const int B = 128; unsigned char* ptr = reinterpret_cast
         
          (dst); while (v >= B) { *(ptr++) = (v & (B-1)) | B; v >>= 7; } *(ptr++) = static_cast
          
           (v); return reinterpret_cast
           
            (ptr); }
           
          
         
const char* GetVarint64Ptr(const char* p, const char* limit, uint64_t* value) { uint64_t result = 0; for (uint32_t shift = 0; shift <= 63 && p < limit; shift += 7) { uint64_t byte = *(reinterpret_cast
          
           (p)); p++; if (byte & 128) { // More bytes are present result |= ((byte & 127) << shift); } else { result |= (byte << shift); *value = result; return reinterpret_cast
           
            (p); } } return NULL; }
           
          
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇编译带加密功能的wxsqlite 下一篇非循环链队类C++定义

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: