我正在阅读 avro 格式规范并试图了解其实现。下面是解码的方法长值 https://avro.apache.org/docs/1.8.2/spec.html#schema_primitive:
@Override
public long readLong() throws IOException {
ensureBounds(10);
int b = buf[pos++] & 0xff;
int n = b & 0x7f;
long l;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 7;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 14;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 21;
if (b > 0x7f) {
// only the low 28 bits can be set, so this won't carry
// the sign bit to the long
l = innerLongDecode((long)n);
} else {
l = n;
}
} else {
l = n;
}
} else {
l = n;
}
} else {
l = n;
}
if (pos > limit) {
throw new EOFException();
}
return (l >>> 1) ^ -(l & 1); // back to two's-complement
}
问题是为什么我们总是检查是否0x7f
小于我们刚刚读取的字节?
这是一种位打包形式,其中每个位的最高有效位byte
用于确定是否另一个byte
应该阅读。从本质上讲,这允许您以比通常需要的更少的字节数对值进行编码。但需要注意的是,如果数量很大,则超过normal需要的字节数。因此,当使用较小的值时,这是成功的。
回答你的问题,0x7F
is 0111_1111
以二进制形式。可以看到最高有效位被用作标志位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)