我尝试解决Android的各种限制,但我很困惑如何解释以下代码
static bool read_mbf(SkStream* stream, int* value)
{
int n = 0;
uint8_t data;
do {
if (!read_byte(stream, &data)) {
return false;
}
n = (n << 7) | (data & 0x7F); // Appends lower 7 bits
} while (data & 0x80); // Handles upper bit as flag!?
*value = n;
return true;
}
在我看来,高位是数据继续的标志。当它丢失时,读取 int 停止。这个对吗?
要在 Java 中正确编码(另见 Daniel 的回答):
private void encode( byte[] array, int offset, int value ) {
if( (value & 0xF0000000) != 0 )
throw new InvalidParameterException("Value " + value + "is too big to be encoded (max: " + 0x0FFFFFFF + ")");
// | 0x80 makes sure, upper most bit is set so next byte is processed
// & 0x7F makes sure, upper most bit is NOT set to end processing
array[offset + 0] = (byte)((value >> 21) | 0x80);
array[offset + 1] = (byte)((value >> 14) | 0x80);
array[offset + 2] = (byte)((value >> 7) | 0x80);
array[offset + 3] = (byte)((value >> 0) & 0x7F);
}
有人可以确认或指出我做错了什么吗?
编辑:
更新了 Java 代码以反映 Daniel Fischer 的更正