%20%D1%84%D0%B0%D0%B9%D0%BB.png)
Мне дали файл по адресуhttps://drive.google.com/file/d/10Fqr6Ipu2J8yKU_m3-EMzsVj7XeSYEdV/view?usp=sharing. Открываем его изhttps://hexed.it/показывает, что это, скорее всего, файл mp3 (на основании информации ID3 в конце файла). Задача состоит в том, чтобы восстановить заголовок файла таким образом, чтобы мы могли открыть его (предположительно в музыкальном проигрывателе). Любые подсказки были бы весьма признательны.
Я заметил, что заголовок файла был пустым, поэтому я попытался скопировать начальные байты из рабочего mp3-файла. Также пробовал переместить последние несколько байтов с читаемым текстом в начало файла. Ни один из этих способов не сработал.
решение1
MP3-файлыне иметьобязательный заголовок; это просто необработанная серия аудиокадров MPEG, причем каждый кадр имеет свой собственный 4-байтовый мини-заголовок (а,б). Все остальное — дополнительное. (Даже теги ID3 и заголовки LAME — оба они появились гораздо позже — замаскированы под недействительные кадры, которые большинство игроков теперь знают, что их нужно игнорировать.)
Кроме того, формат кадра является самосинхронизирующимся – вы можете вырезать его в любой момент, и декодер проигнорирует мусорный полукадр в начале, ища биты синхронизации, 0xFFF
чтобы найти начало следующего кадра. Это означает, что вы можете буквально бросить любой случайный кусок файла MP3 в декодер, и он должен воспроизвести; если этого не происходит, то это, скорее всего, вообще не файл MP3.
Я бы пришел к выводу, что ваш файл не MP3; это что-то другое, использующее формат тегов ID3 (редко, но не необычно). Более того, конечные биты вашего файла не выглядятдовольнокак тег ID3 — многие из этих 4-буквенных идентификаторов фрагментов не начинаются с буквы «T», как это было бы типично для ID3v2; мне они кажутся больше похожими на то, что можно найти вформат фрагментовтакой какАИФФилиWAV/RIFF(оба действительно встраивают теги ID3!), но не в MP3.
(Ну, да, тег ID3 сам по себе также является фрагментированным форматом, но MP3 в целом таковым не является, вот в чем суть.)
Помимо IFF и его производных AIFF/RIFF, существует довольно много других форматов с тегами/фрагментами, например, PNG, а также ISO BMFF (который используется для файлов MP4/HEIF/AVIF), которые по своей концепции схожи, но конкретные имена фрагментов, используемые в вашем файле – LIST
, INFO
– являются отличительными RIFF, которые используются для различных форматов, связанных с Windows: .wav для аудио, .avi для видео, .ani для анимированных курсоров мыши и т. д. Почти в data
самом начале, скорее всего, также находится тег фрагмента.
Из этих подформатов RIFF фрагменты IART
(исполнитель), ICRD
(дата), IGNR
(жанр), id3␣
(встроенный тег ID3) будут типичными для файла WAV.Чего не хватает, так это RIFF
фрагмента верхнего уровня.(и, возможно, часть фрагмента fmt␣
), что не позволяет проигрывателям распознать файл.
Смещение 0x10 выглядит как полное содержимое фрагмента fmt␣
при сравнении с другим файлом .wav, поэтому отсутствующие начальные восемь байт должны выглядеть так:
00000000 52 49 46 46 __ __ __ __ 57 41 56 45 66 6d 74 20 |RIFF____WAVEfmt |
…с пустой частью, которая является длиной фрагмента верхнего уровня (или 0xFFFFFFFF, чтобы просто указать «весь файл»). Общая структура должна быть такой:
RIFF[WAVE]
├─fmt␣ (PCM S16LE)
├─data (~Never gonna give you up~)
├─LIST[INFO]
│ ├─IART = "GCTF"
│ ├─ICRD
│ └─IGNR = "Drum & Bass"
└─id3␣ (embedded ID3, not RIFF-format)
├─TPE1 = "GCTF"
├─TDRC
└─TCON = "Drum & Bass"
Если вы пытаетесь восстановить заголовок, используйте fq
для его проверки (что также хорошо работает для реальных файлов MP3 и других распространенных форматов):
$ fq . test.wav
$ fq .chunks[] test.wav
$ fq .chunks[2].chunks[] test.wav
В качестве альтернативы, поскольку у вас есть весь data
фрагмент, содержащий все данные PCM (длиной 4 байта), может быть проще извлечь только эту часть и попробовать различные форматы необработанных PCM методом перебора (комбинаций не так уж и много).