编码和解码同步安全整数的最佳方法是什么?
A synchsafe integer(用于 ID3v2 标签)是其中最高有效位始终为
0
且被忽略的整数。
例如,
11111111
(255) 作为同步安全整数是 00000001 01111111
(383);和11111111 11111111
相当于一个同步安全00000011 01111111 01111111
.
解决方案可用在维基百科同步安全页面.
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
}