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

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中
}

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值