编码和解码同步安全整数
什么是编码和解码同步安全整数的最佳方法?
同步安全整数(在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
解决方案可以在维基百科的同步安全页面找到。