首页 > 其他分享 >leveldb学习笔记之七——util/coding.h

leveldb学习笔记之七——util/coding.h

时间:2022-11-07 13:06:47浏览次数:47  
标签:之七 char leveldb ++ dst value util buf ptr


coding.h中主要是与编码相关的内容,主要选取以下几个函数进行分析:

  • EncodeFixed32
void EncodeFixed32(char* buf, uint32_t value) {
if (port::kLittleEndian) { //小端次序直接使用memcpy
memcpy(buf, &value, sizeof(value));
} else { //大端次序则按字节处理
buf[0] = value & 0xff;
buf[1] = (value >> 8) & 0xff;
buf[2] = (value >> 16) & 0xff;
buf[3] = (value >> 24) & 0xff;
}
}
  • PutFixed32
void PutFixed32(std::string* dst, uint32_t value) {
char buf[sizeof(value)];
EncodeFixed32(buf, value);
dst->append(buf, sizeof(buf)); //对数据编码后再将长度放入
}
  • EncodeVarint32
    varint编码是一种变长编码,用来减少数据的存储空间。在varint的每个字节中,如果最高位bit为1,表示后续的字节也是该数字的一部分,如果该位是0,则结束。其它的7个比特都用来表示数据。因此小于128的数字都可以用一个字节来表示。
char* EncodeVarint32(char* dst, uint32_t v) {
unsigned char* ptr = reinterpret_cast<unsigned char*>(dst);
static const int B = 128;
if (v < (1<<7)) { //小于128的一个字节就能搞定
*(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<char*>(ptr);
}
  • PutVarint32
//将编码后的数据追加到dst中
void PutVarint32(std::string* dst, uint32_t v) {
char buf[5];
char* ptr = EncodeVarint32(buf, v);
dst->append(buf, ptr - buf);
}
  • PutLengthPrefixedSlice
void PutLengthPrefixedSlice(std::string* dst, const Slice& value) {
PutVarint32(dst, value.size());
dst->append(value.data(), value.size()); //将value编码到dst中
}

此文件中的函数都比较简单,此处不全部做分析。

学习是一种慰藉,编程是一种情怀,技术提升永不可辜负!


标签:之七,char,leveldb,++,dst,value,util,buf,ptr
From: https://blog.51cto.com/u_15862521/5828910

相关文章

  • leveldb学习笔记之四——include/leveldb/slice.h
    在真正开始研究leveldb的存储过程之前,先来研究一下相关的结构,首先是slice。为了操作方便,leveldb将数据和长度包装成了slice使用,至于为什么要这么做,估计是两位大神是为了效率......
  • leveldb学习笔记之三——include/leveldb/db.h
    此文件为leveldb的c++接口文件,用c++的方式调用leveldb只需要包含此文件即可。在此文件中定义了leveldb对外的接口DB,其具体的实现由db/db_impl.h中的DBImpl类实现。DB的定......
  • leveldb学习笔记之二——源码目录结构
    说明从今天开始,将正式进入leveldb源码的学习。leveldb主要采用c++实现,整体代码比较规范,除了学习存储相关的原理,还可以学习c++相关的知识,提升c++的技巧。目录leveldb的目录结......
  • leveldb学习笔记之六——db/memtable.h
    db数据在内存中的存储格式,写操作的数据都会先写到memtable中类classMemTable{public://构造函数,不允许隐式转换,参数为内部key比较器explicitMemTable(constInte......
  • leveldb学习笔记之一——clion调用leveldb使用示例
    前言2018年杀入区块链,算是接触了分布式、数据存储这一系列的知识,前段时间接触某手机厂商的技术人员,才发现自己在存储方面知识的不足,因此这段时间准备沉下心来学习学习。接下......
  • leveldb学习笔记之十——leveldb/util/cache.cc
    cache.cc中的代码是Cache的实现代码,其中主要涉及到LRUHandle、HandleTable、LRUCache以及ShardedLRUCache。它们与Cache的关系如下:ShardedLRUCache是抽象类Cache的实现,提供......
  • Rust 编程中使用 leveldb 的简单例子
    前言最近准备用Rust写一个完善的blockchain的教学demo,在持久化时考虑到使用leveldb。通过查阅文档,发现Rust中已经提供了使用leveldb的接口。将官方的例子修改了下,能够运行通......
  • HttpsUtil
    packagecom.raiyi.flowcenter.utils.http;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStrea......
  • 关于工具类的学习-StringUtils(常用)
    关于工具类的学习-StringUtils(常用)packagecom.WT.bigdata.dsjmh.api.utils;importjava.util.HashMap;importjava.util.Map;publicclassStringUtils{/**......
  • 2流高手速成记(之七):基于Dubbo&Nacos的微服务简要实现
    本节内容会用到之前给大家讲过的这两篇:2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化链接挂......