【发布时间】:2012-12-18 10:13:08
【问题描述】:
我尝试解决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 的更正
【问题讨论】:
-
您对 C 代码的解释听起来很明智。在 Java 中,您必须小心,因为所有整数类型都是有符号的。
-
那行不通。 c 函数正在读取被编码为尽可能少的字节数以节省空间的整数。例如。 0 到 127 占用一个字节。无论如何,您总是输出四个字节。在这种情况下,c 函数需要一个字节,并在再次调用时将以下内容读入其他数字。
-
@DiegoBasch 我真的不明白你在说什么。如果您有
10000000,则七个0将向左移动并且根本没有效果。当然,我可以限制不必要的空字节,但 IMO 它应该可以工作。 -
重复调用 c 函数从字节流中读取数字。如果将 127 编码为四个字节,它只会消耗这四个字节中的一个。下一次它会读取你的四个字节中的第二个,认为它是一个新数字。
-
我希望这可以工作,因为设置了
0x80(continue) 位。但也许我太累了。明天再来看看。
标签: java android c image-processing