我正在阅读 avro 格式规范并尝试了解其实现。这里是解码的方法long value :
@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
是否小于我们刚刚读取的字节?
最佳答案
这是一种位打包形式,其中每个字节
的最高有效位用于确定是否应读取另一个字节
。从本质上讲,这允许您以比通常需要的更少的字节数对值进行编码。但是,需要注意的是,如果数字很大,则需要的字节数将超过正常。因此,当使用较小的值时,这是成功的。
回答你的问题,0x7F
是二进制的 0111_1111
。可以看到最高有效位被用作标志位。
关于java - 0x7f 有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50764797/