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
- leveldb源码中变长编码代码
- leveldb源码剖析--编码
- leveldb源码--PosixEnv代码分享
- 变长编码
- leveldb-编码
- UTF8编码-变长编码
- LevelDB 存储编码
- levelDB源码分析-提纲
- levelDB源码分析-Slice
- levelDB源码分析-Status
- levelDB源码分析-Arena
- levelDB源码分析-Skiplist
- levelDB源码分析-Memtable
- levelDB源码分析-SSTable
- levelDB源码分析-TableCache
- Leveldb源码分析--1
- Leveldb源码分析--2
- Leveldb源码分析--3
- 高德百度坐标系转换方法
- 使用opencl实现编码算法中运动搜索模块速度对比
- 测温芯片DS18B20详细解读
- adb命令
- 客户服务在企业DevOps体系中拥有关键性作用的两大理由
- leveldb源码中变长编码代码
- 更新cocoapods
- Yii2 选择布局的方式
- .net 将数据库中的数据导出到Excel表格中
- 这可能才是PSV破解不了的真正原因—破解的无奈
- 机顶盒焦点问题
- Mac中MySQL无法显示中文全解决
- 工作随笔:BaseAsyncTask执行完doInBackground不执行onPostExecute
- C++Primer第五版 11.3.6节练习