【leveldb源码】数据结构之Slice

源文件连接,Slice定义在头文件中,leveldb命名空间下。

class LEVELDB_EXPORT Slice {
    
    
	private:
	  const char* data_;
	  size_t size_;
}
  • 宏定义出现在了类名,是有关动态链接库的生成,具体动态链接库的原理这篇文章写的特别好
  • 在类里面定义了data_和size_两个变量,定义了所有的构造函数、clear、empty、tostring、compare等方法。
  • 类里面涉及到了操作符重载的写法,将操作符重载实现为类的成员函数,详细解释可以看这篇博文
  • 一个非常非常优秀的java版本Slice的链接
  • Leveldb对于数字的存储是little-endian的,在把int32或者int64转换为char*的函数中,是按照先低位再高位的顺序存放的,也就是little-endian的。所以,在将byte数组中的数据转换为short的时候,先要把高位左移8位,再与低位做或运算。
    public short getShort(int index)
    {
          
          
    	// 终于用上了快手潜在CTO——美悦强推的guava,看到博文的你,快在下面请CTO内推
        checkPositionIndexes(index, index + SHORT_UNIT, this.length);
        index += offset;
        return (short) (data[index] & 0xFF | data[index + 1] << 8);
    }
    
  • java没有unsigned byte类型,因此需要通过计算,将signed byte(byte默认类型)转换为unsigned byte。

java中所有的byte类型都是signed类型。只能表达(-128,127).而此处的代码为了读取像素值,所需要的值是(0,255),所以需要的是unsigned byte而不是signed byte。通过将byte声明为short或者int类型。然后与0xFF取&。即可将signed byte转为unsigned byte。0xff 表示为二进制就是 1111 1111。在signed byte类型中,代表-1;但在short或者int类型中则代表255.当把byte类型的-1赋值到short或者int类型时,虽然值仍然代表-1,但却由1111 1111变成1111 1111 1111 1111.再将其与0xff进行掩码:
-1: 11111111 1111111
0xFF: 00000000 1111111
255: 00000000 1111111
所以这样,-1就转换成255.

	(short) (getByte(index) & 0xFF);

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/108560473