每个ID 3v 2帧的数据大小存储在帧头块的4、5、6和7字节中(根据文档):
x1c 0d1x的数据
我正在从这个mp3文件中阅读帧大小:
的
要将帧数据大小转换为整数,我使用以下代码:
int frame_data_sz = b4 << 21 | b5 << 14 | b6 << 7 | b7;
字符串
例如,对于大多数帧,此代码正确计算帧大小:
TALB-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TIT 2-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TPE 1-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TCON-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TCOM-> 0x 00 0x 00 0x 00 0x 02-> 2字节-正确!
TRCK-> 0x 00 0x 00 0x 00 0x 03-> 3字节-正确!
TLEN-> 0x 00 0x 00 0x 00 0x 06-> 6字节-正确!
COMM-> 0x 00 0x 00 0x 00 0x 06-> 6字节-正确!
APIC-> 0x 00 0x 01 0x 0 F 0x 5D-> 18397字节-不正确!
对于“APIC”帧,我的代码计算错误的帧大小值,因为实际数据大小值为71517字节。
如何正确地将帧大小转换为整数值?
1条答案
按热度按时间bvuwiixz1#
ID 3v 2头的第4个字节告诉我们它的版本:
$02
是version 2.2.0,$03
是version 2.3.0 =您的文件,$04
将是version 2.4.0 =如何处理阅读帧的文件。虽然标题大小在所有3个版本中存储相同,但帧大小的存储方式都不同-您的阅读方式仅适用于版本2.4.0:
| 2.2.0| 2.3.0| 2.4.0| 2.4.0 |
| --|--|--| ------------ |
| 4 *
%0xxxxxxx
= 28位|4 *%0xxxxxxx
= 28位|4 *%0xxxxxxx
= 28位| 4 *%0xxxxxxx
= 28 bit ||
$xx xx xx
= 24位|$xx xx xx xx
= 32位|4 *%0xxxxxxx
= 28位| 4 *%0xxxxxxx
= 28 bit |但是还有更多的不一致之处,暗示着误解了标签格式,无论是哪个软件编写的:
$00
,进一步毫无目的地扩大了标记的大小。rus
的信息,但是由于描述和文本都是空的,这也是浪费空间(和意义)。APIC
的大小为$00 01 0f 5d
,十进制实际为69,469(67.84 KiB)。这与您预期的2048字节相差甚远。