代码如下:
/** Reads an int stored in variable-length format. Reads between one and
* five bytes. Smaller values take fewer bytes. Negative numbers are not
* supported.
public int readVInt() throws IOException {
byte b = readByte();
int i = b & 0x7F;
for (int shift = 7; (b & 0x80) != 0; shift += 7) {
b = readByte();
i |= (b & 0x7F) << shift;
}
return i;
}英文说明的意思好像是读出一个整数,然后读取一到五字节范围,(因为有可能这个数很大)
我做了个试验输入21,
最后返回是85,不知道这个函数的功能有什么意义,可能中间计算有错
我自己的运算步骤如下:
b=21,10101
b&0x7F:0010101 (和全1相与有什么用呢?)
(b&0x7F)<<7:1000000
再和i或:1010101=(85)
/** Reads an int stored in variable-length format. Reads between one and
* five bytes. Smaller values take fewer bytes. Negative numbers are not
* supported.
public int readVInt() throws IOException {
byte b = readByte();
int i = b & 0x7F;
for (int shift = 7; (b & 0x80) != 0; shift += 7) {
b = readByte();
i |= (b & 0x7F) << shift;
}
return i;
}英文说明的意思好像是读出一个整数,然后读取一到五字节范围,(因为有可能这个数很大)
我做了个试验输入21,
最后返回是85,不知道这个函数的功能有什么意义,可能中间计算有错
我自己的运算步骤如下:
b=21,10101
b&0x7F:0010101 (和全1相与有什么用呢?)
(b&0x7F)<<7:1000000
再和i或:1010101=(85)
byte b = readByte(); //这一句读取第一个byte,此时读出的是8位
int i = b & 0x7F; //这里只取低7位
for (int shift = 7; (b & 0x80) != 0; shift += 7) { //这里循环读下一个byte,知道读出的为负数。
b = readByte(); //这里是读的动作
i |= (b & 0x7F) < < shift; //这里把后读到的byte取低7位,放到刚读到的7位的前面
}
return i;