正如您所发现的,文件格式似乎由带有标签的标题组成。这些标头中的每一个似乎都是 16+ 字节,其中 4 个字节用于标记,4 个字节用于标头长度,4 个字节用于标头 + 数据的大小,还有 4 个我不确定的字节。不幸的是,这些长度字节是big endian,这让我认为 bpm 也可以存储在 big endian IEEE float 中,这可能是您找不到任何东西的原因。
第一个标题,PMAI。似乎是某种信封(它的长度字段是文件本身的大小),其余的标题似乎是各种形式的数据内容。
我写了一个小程序来转储部分名称和长度(请不要将其用作良好样式的示例!):
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
analyze(argv[1]);
}
int analyze(char *filename) {
FILE *fp;
struct {
char tag[4];
int x0;
int x1;
int x2;
} header;
int length;
if ((fp=fopen(filename, "rb"))==NULL) {
perror(filename); return;
}
while (fread(&header, sizeof header, 1, fp)) {
header.x0=ntohl(header.x0);
header.x1=ntohl(header.x1);
header.x2=ntohl(header.x2);
printf("%04x %4.4s: %08x (%06d) | %08x (%06d) | %08x (%06d)\n",
ftell(fp)-sizeof(header),
header.tag,
header.x0, header.x0,
header.x1, header.x1,
header.x2, header.x2
);
if (!memcmp(header.tag, "PMAI", 4)) { // outer container
length=header.x0; // just skip header
} else if (!memcmp(header.tag, "PPTH", 4)) {
int i;
for (i=0; i<header.x2; i+=2) {
getc(fp);
putchar(getc(fp));
}
putchar('\n');
continue;
} else {
length=header.x1; // else skip data
}
fseek(fp, length-sizeof(header), 1);
}
}
产生以下输出:
$ ./sections ANLZ0000.DAT
0000 PMAI: 0000001c (000028) | 000028fc (010492) | 00000001 (000001)
001c PPTH: 00000010 (000016) | 00000100 (000256) | 000000f0 (000240)
E:\music\247 Hardcore\[+singles]\[247HC055] [12B] Al Storm Ft. Malaya - Everytime We Say Goodbye (Technikore Remix).mp3
011c PVBR: 00000010 (000016) | 00000654 (001620) | 00000000 (000000)
0770 PQTZ: 00000018 (000024) | 00001f40 (008000) | 00000000 (000000)
26b0 PWAV: 00000014 (000020) | 000001a4 (000420) | 00000190 (000400)
2854 PWV2: 00000014 (000020) | 00000078 (000120) | 00000064 (000100)
28cc PCOB: 00000018 (000024) | 00000018 (000024) | 00000001 (000001)
28e4 PCOB: 00000018 (000024) | 00000018 (000024) | 00000000 (000000)
$ ./sections ANLZ0000.EXT
0000 PMAI: 0000001c (000028) | 0000cf56 (053078) | 00000001 (000001)
001c PPTH: 00000010 (000016) | 00000100 (000256) | 000000f0 (000240)
E:\music\247 Hardcore\[+singles]\[247HC055] [12B] Al Storm Ft. Malaya - Everytime We Say Goodbye (Technikore Remix).mp3
011c PWV3: 00000018 (000024) | 0000ce26 (052774) | 00000001 (000001)
cf42 PKEY: 00000014 (000020) | 00000014 (000020) | 0000000c (000012)
因此,PMAI 是容器。PPTH 是 MP3 文件的名称。PVBR 大概是关于可变比特率的信息,PQTZ 是量化,以及 PWAV、PWV2 和 PWV3 各种波形的信息。只剩下 PCOB 和 PKEY 可能包含比特率。不幸的是,如果您查看这些的十六进制转储:
000028c0 xx xx xx xx xx xx xx xx xx xx xx xx 50 43 4f 42 ............PCOB
000028d0 00 00 00 18 00 00 00 18 00 00 00 01 00 00 00 00 ................
000028e0 ff ff ff ff 50 43 4f 42 00 00 00 18 00 00 00 18 ....PCOB........
000028f0 00 00 00 00 00 00 00 00 ff ff ff ff ............
0000cf40 xx xx 50 4b 45 59 00 00 00 14 00 00 00 14 00 00 ..PKEY..........
0000cf50 00 0c 00 00 00 00
似乎 PCOB 包含 00 00 00 00 ff ff ff ff,而 PKEY 包含 00 00 00 00。这些看起来都不是 170。
这篇文章说“如果 rekordbox 在启动时崩溃,请将 database.backup.edb 重命名为 database.edb,如果它仍然崩溃,请删除所有数据文件”。由于 BPM 似乎没有存储在 ANLZ.* 文件中 - 您也有 database.edb 吗?BPM 可以存储在那里吗?