leveldb源码中变长编码代码

来源:互联网 发布:python cmdb 编辑:程序博客网 时间:2024/06/13 23:35

leveldb中编码代码:


#include <cstdio>#include <iostream>#include <string>#include <cstring>typedef signed char           int8_t;typedef signed short          int16_t;typedef signed int            int32_t;typedef signed long long      int64_t;typedef unsigned char         uint8_t;typedef unsigned short        uint16_t;typedef unsigned int          uint32_t;typedef unsigned long long    uint64_t;#define CLR(a, b) memset((a), 0, (b))static bool LittleEndian = true;class EncodeDecode{public:    EncodeDecode();    virtual ~EncodeDecode();void EncodeFixed32(char* dst, uint32_t value);void EncodeFixed64(char* dst, uint64_t value);uint32_t DecodeFixed32(const char* ptr);uint64_t DecodeFixed64(const char* ptr);void PutVarint32(std::string* dst, uint32_t value);void PutVarint64(std::string* dst, uint64_t value);bool GetVarint32(std::string& input, uint32_t* value);bool GetVarint64(std::string& input, uint64_t* value);private:char* EncodeVarint32(char* dst, uint32_t value);char* EncodeVarint64(char* dst, uint64_t 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<const unsigned char*>(p));p++;if (byte & 128) {// More bytes are presentresult |= ((byte & 127) << shift);} else {result |= (byte << shift);*value = result;return reinterpret_cast<const char*>(p);}}return NULL;}const char* GetVarint32Ptr(const char* p,   const char* limit,   uint32_t* value) {if (p < limit) {uint32_t result = *(reinterpret_cast<const unsigned char*>(p));if ((result & 128) == 0) {*value = result;return p + 1;}}return GetVarint32PtrFallback(p, limit, value);}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<const unsigned char*>(p));p++;if (byte & 128) {// More bytes are presentresult |= ((byte & 127) << shift);} else {result |= (byte << shift);*value = result;return reinterpret_cast<const char*>(p);}}return NULL;}};EncodeDecode::EncodeDecode(){}EncodeDecode::~EncodeDecode(){}void EncodeDecode::EncodeFixed32(char* dst, uint32_t value){if(LittleEndian){memcpy(dst, &value, sizeof(value));}else{dst[0] = value & 0xff;dst[1] = (value >> 8)  & 0xff;dst[2] = (value >> 16) & 0xff;dst[3] = (value >> 24) & 0xff;}}void EncodeDecode::EncodeFixed64(char* dst, uint64_t value){if (LittleEndian) {memcpy(dst, &value, sizeof(value));} else {dst[0] = value & 0xff;dst[1] = (value >> 8) & 0xff;dst[2] = (value >> 16) & 0xff;dst[3] = (value >> 24) & 0xff;dst[4] = (value >> 32) & 0xff;dst[5] = (value >> 40) & 0xff;dst[6] = (value >> 48) & 0xff;dst[7] = (value >> 56) & 0xff;}}uint32_t EncodeDecode::DecodeFixed32(const char* ptr){uint32_t res;if(LittleEndian){memcpy(&res, ptr, sizeof(res));return res;}else{res = ((static_cast<uint32_t>(static_cast<unsigned char>(ptr[0])))   |(static_cast<uint32_t>(static_cast<unsigned char>(ptr[1])) << 8)   |(static_cast<uint32_t>(static_cast<unsigned char>(ptr[2])) << 16)   |(static_cast<uint32_t>(static_cast<unsigned char>(ptr[3])) << 24));return res;}}uint64_t EncodeDecode::DecodeFixed64(const char* ptr){uint64_t res;if(LittleEndian){memcpy(&res, ptr, sizeof(res));return res;}else{uint64_t lo = DecodeFixed32(ptr);uint64_t hi = DecodeFixed32(ptr + 4);res = (hi << 32) | lo;return res;}}char* EncodeDecode::EncodeVarint32(char* dst, uint32_t value){unsigned char* ptr = reinterpret_cast<unsigned char*>(dst);static const int B = 128;if (value < (1<<7)) {*(ptr++) = value;} else if (value < (1<<14)) {*(ptr++) = value | B;*(ptr++) = value>>7;} else if (value < (1<<21)) {*(ptr++) = value | B;*(ptr++) = (value>>7) | B;*(ptr++) = value>>14;} else if (value < (1<<28)) {*(ptr++) = value | B;*(ptr++) = (value>>7) | B;*(ptr++) = (value>>14) | B;*(ptr++) = value>>21;} else {*(ptr++) = value | B;*(ptr++) = (value>>7) | B;*(ptr++) = (value>>14) | B;*(ptr++) = (value>>21) | B;*(ptr++) = value>>28;}return reinterpret_cast<char*>(ptr);}char* EncodeDecode::EncodeVarint64(char* dst, uint64_t value){static const int B = 128;unsigned char* ptr = reinterpret_cast<unsigned char*>(dst);while (value >= B) {*(ptr++) = (value & (B-1)) | B;value >>= 7;}*(ptr++) = static_cast<unsigned char>(value);return reinterpret_cast<char*>(ptr);}void EncodeDecode::PutVarint32(std::string* dst, uint32_t v) {char buf[5];char* ptr = EncodeVarint32(buf, v);dst->append(buf, ptr - buf);}void EncodeDecode::PutVarint64(std::string* dst, uint64_t v) {char buf[10];char* ptr = EncodeVarint64(buf, v);dst->append(buf, ptr - buf);}bool EncodeDecode::GetVarint32(std::string& input, uint32_t* value){const char* p = input.data();const char* limit = p + input.size();const char* q = GetVarint32Ptr(p, limit, value);if (q == NULL) {return false;} else {input = std::string(q, limit - q);return true;}}bool EncodeDecode::GetVarint64(std::string& input, uint64_t* value){const char* p = input.data();const char* limit = p + input.size();const char* q = GetVarint64Ptr(p, limit, value);if (q == NULL) {return false;} else {input = std::string(q, limit - q);return true;}}int main(int argc, char *argv[]){    EncodeDecode *ED = new EncodeDecode();    char buf[20];CLR(buf, 20);uint32_t num = 123456;ED->EncodeFixed32(buf, num);uint32_t numd = ED->DecodeFixed32(buf);std::cout << numd << std::endl;CLR(buf, 20);uint64_t num2 = 123456789;ED->EncodeFixed64(buf, num2);uint64_t num2d = ED->DecodeFixed64(buf);std::cout << num2d << std::endl;CLR(buf, 20);std::string str;uint32_t num3 = 123454321, num3d = 0;ED->PutVarint32(&str, num3);ED->GetVarint32(str, &num3d);std::cout << num3d << std::endl;std::string str2;uint64_t num4 = 12345654321, num4d = 0;ED->PutVarint64(&str2, num4);ED->GetVarint64(str2, &num4d);std::cout << num4d << std::endl;    return 0;}


0 0
原创粉丝点击