编码和解码同步安全整数

问题描述 投票:0回答:2

编码和解码同步安全整数的最佳方法是什么?


A synchsafe integer(用于 ID3v2 标签)是其中最高有效位始终为

0
且被忽略的整数。

例如,

11111111
(255) 作为同步安全整数是
00000001 01111111
(383);和
11111111 11111111
相当于一个同步安全
00000011 01111111 01111111
.

python mp3 bit-manipulation id3
2个回答
1
投票

0
投票

wikipedia 上的解好像被删掉了。这个概念很简单。 synchsafe 值是一个字节数组,其中最高有效位被屏蔽然后移动 7.

我需要这个功能,所以我编写了这个 kotlin 函数来将 s 字节数组转换为长整数。 ID3V2 也有一个使用 5 个字节的校验和,因此数组大小决定了输出。我检查以确保所有字节都对同步安全有效,如果无效则抛出异常。我不检查溢出。

private fun ByteArray.getSyncSafe() : Long {
    var rv = 0L
    if (any{0x80 and it.toInt() != 0})
        throw RuntimeException("TAG: ${this.map{
            "0x%02x".format(it.toInt())
        }}: Bad synchsafe array.")
    map{rv = rv.shl(8) + it.toLong()}
    return rv
}
© www.soinside.com 2019 - 2024. All rights reserved.