编码和解码同步安全整数
编码和解码同步安全整数的最佳方法是什么?
同步安全整数(在 ID3v2 标记中使用)是一种最高有效位始终为 0
且被忽略的整数。
例如,11111111
(255) 作为同步安全整数是 00000001 01111111
(383); 11111111 11111111
相当于同步安全00000011 01111111 01111111
。
What is the best way to encode and decode synchsafe integers?
A synchsafe integer (used in ID3v2 tags) is one in which the most significant bit is always 0
and is disregarded.
For example, 11111111
(255) as a synchsafe integer is 00000001 01111111
(383); and 11111111 11111111
is equivalent to a synchsafe 00000011 01111111 01111111
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
维基百科同步安全页面提供了解决方案。
Solution is available on Wikipedia synchsafe page.
维基百科上的解决方案似乎已被删除。这个概念很简单。 synchsafe 值是一个字节数组,其中最高有效位被屏蔽,然后移位 7。
我需要这个功能,所以我编写了这个 kotlin 函数来将 s 字节数组转换为 long。 ID3V2 还有一个使用 5 个字节的校验和,因此数组大小决定了输出。我检查以确保所有字节对于同步安全都有效,如果有则抛出异常。我不检查溢出。
The solution on wikipedia seems to have been edited out. The concept is simple. the synchsafe value is an array of bytes with the most significant bit masked out then shifted by 7.
I needed the functionality so I wrote this kotlin function to convert s byte array into a long. ID3V2 also has a checksum that uses 5 bytes so the array size determines the output. I check to make sure all the bytes in are valid for synch-safe and throw an exception if any are not. I don't check for overflow.