leveldb中的编码方式的分析
2013-11-03 10:06
330 查看
leveldb除去测试部分,也不到2w行,看完代码才发觉这是由于编程的人太牛了。好多代码的实现几行代码就可以实现,当然非常简单了。
先说说他的变长编码的实现方法。
下面为定长格式编码,判断如果是小段方式就直接拷贝,如果是大端方式,为了保证低地址存放低位数据,通过按字节赋值的方法实现。
先说说他的变长编码的实现方法。
char* EncodeVarint32(char* dst, uint32_t v) { // Operate on characters as unsigneds unsigned char* ptr = reinterpret_cast<unsigned char*>(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<char*>(ptr); }
下面为定长格式编码,判断如果是小段方式就直接拷贝,如果是大端方式,为了保证低地址存放低位数据,通过按字节赋值的方法实现。
void EncodeFixed32(char* buf, uint32_t value) { #if __BYTE_ORDER == __LITTLE_ENDIAN 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; #endif }
相关文章推荐
- ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式比较分析
- openssl ans.1编码规则分析及证书密钥编码方式
- 05 识别毒酒——几种算法和编码方式的分析和比较
- 文件编码方式的分析与理解
- Draco代码分析(一) —— Encode过程&探究其数据编码方式
- 编码方式与程序中文乱码原因分析
- 分析wget与curl发送web请求方式的区别
- 三种Tomcat集群方式的优缺点分析
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- 远程通信之Dubbo架构分析与使用方式介绍
- 工作流系统的硬伤- 修改有数据的表单限制及解决方式分析
- KVC-键值编码是一种间接地访问实例变量的方式
- Windows CE S3C2440A开机启动滚动条编码分析
- NAT的全然分析及其UDP穿透的全然解决方式
- 改变MyEclipse的默认编码方式
- 分析Hadoop 1.x三种启动停止方式
- 深入分析 Java 中的中文编码问题
- C++异常机制的实现方式和开销分析
- ddk无法编译utf-8编码方式的源文件
- G.729A--编码--LP(线性预测)分析之LPC(线性预测系数)的计算