首先解释原因:
我有各种MP3链接的链接列表,我正在尝试快速阅读这些文件的ID3信息。我只下载前1500个左右的字节,并尝试分析这个块中的数据。我遇到了ID3Lib,但我只能让它完全下载文件并且没有注意到对Streams的任何支持。 (如果我错了,请随意指出)
基本上,我只是试图自己解析ID3标签。标签的大小可以从文件开头附近的四个字节确定。来自ID3网站:
ID3v2标签大小编码为最多四个字节 在每个字节中将有效位(第7位)设置为零,从而产生总数 28位。忽略零位,因此标记长度为257字节 代表$ 00 00 02 01。
基本上是这样的:
00000000 00000000 00000010 00000001
变为
0000 00000000 00000001 00000001
我对位级操作不太熟悉,并且想知道是否有人可以对优雅的解决方案有所了解,忽略这四个字节中每个字节的最左边位?我试图从它中提取一个10的整数,所以这也可以。
干杯, -Josh
答案 0 :(得分:4)
如果你有四个单独的字节,你需要:
int value = ((byte1 & 0x7f) << 21) |
((byte2 & 0x7f) << 14) |
((byte3 & 0x7f) << 7) |
((byte4 & 0x7f) << 0);
如果你已经在一个int
中获得了它:
int value = ((value & 0x7f000000) >> 3) |
((value & 0x7f0000) >> 2) |
((value & 0x7f00) >> 1) |
(value & 0x7f);
答案 1 :(得分:0)
要清除最高有效位,AND与127(0x7F),这将使所有位与MSB分开。
int tag1 = tag1Byte & 0x7F; // this is the first one read from the file
int tag2 = tag2Byte & 0x7F;
int tag3 = tag3Byte & 0x7F;
int tag4 = tag4Byte & 0x7F; // this is the last one
要将其转换为单个数字,请认识到每个标记值都是128位数。因此,最小重要性乘以128 ^ 0(1),接下来的128 ^ 1(128),第三重要(128 ^ 2),依此类推。
int tagLength = tag4+(tag3<<7)+(tag2<<14)+(tag1<<21)
你提到你想将它转换为基数10.你可以将它转换为基数10,比如用于打印,使用int到字符串转换:
String base10 = String.valueOf(tagLength);