编码和解码同步安全整数

0 投票
2 回答
830 浏览
提问于 2025-04-16 16:28

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


同步安全整数(在ID3v2标签中使用)是一种特殊的整数,它的最高位总是 0,这个位是被忽略的。

举个例子,11111111(255)作为同步安全整数是 00000001 01111111(383);而 11111111 11111111 则相当于同步安全的 00000011 01111111 01111111

2 个回答

0

维基百科上的解决方案似乎被删掉了。这个概念其实很简单。同步安全值是一个字节数组,最重要的那一位被屏蔽掉,然后向右移动了7位。

因为我需要这个功能,所以我写了一个Kotlin函数,把字节数组转换成一个长整型。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
}
1

解决方案可以在维基百科的同步安全页面找到。

撰写回答