私は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);
}
誰かが私が間違ったことを確認または指摘できますか?
編集:
DanielFischerによる修正を反映するようにJavaコードを更新しました