在四个字节中忽略最左边的位

本文关键字:左边 字节 四个 | 更新日期: 2023-09-27 17:50:11

首先解释一下原因:

我有一个链接到各种MP3链接的列表,我正试图快速读取这些文件的ID3信息。我只下载了前1500字节左右,并试图分析这个块中的数据。我遇到了ID3Lib,但我只能让它在完全下载的文件上工作,并没有注意到任何对流的支持。(如果我错了,请指出来)

基本上,我要自己解析ID3标签。标记的大小可以从文件开头附近的四个字节确定。来自ID3站点:

ID3v2标签的大小是用四个字节编码的每个字节的有效位(第7位)设置为零,使其成为总数28位的。0位被忽略,因此257字节长的标记被忽略表示为$00 00 02 01.

基本上:

00000000 00000000 00000010 00000001

0000 00000000 00000001 00000001

我不太熟悉位级操作,想知道是否有人可以提供一些优雅的解决方案来忽略这四个字节中每个的最左边的位?我试着从中提取一个以10为基数的整数,这样也可以。

在四个字节中忽略最左边的位

如果您有四个单独的字节,您需要:

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);

要清除最高有效位,并使用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);