8

Сегодня я только что обнаружил, что могу объединить некоторые файлы с помощью команды copy /b . В частности, я заметил, что когда я слил два mp3-файла, проигрыватель VLC демонстрировал забавное поведение со временем:

             Взять 1

Здесь это вполне нормально, но первая музыка подходила к концу ... потом последовала забавная часть ...

            Взять 2              Взять 3

Здесь поиск времени буквально бежал, как он играл.

Объединяя изображения или PDF с этой техникой, я обнаружил, что при правильном увеличении размера файла будет отображаться только первое изображение.

Итак, мой вопрос: что именно делает команда copy /b ? Это действительно предназначено для объединения файлов или это хак?

4 ответа4

10

Флаг /b команды copy обрабатывает файлы как двоичные (т. Е. Необработанный поток бессмысленных байтов) и копирует их байт за байт вместо поведения по умолчанию (или /a), которое обрабатывает их как строки текста (с символы конца строки, конец файла и т. д.)

Вы можете объединить текстовые файлы либо с текстовым поведением по умолчанию, либо с двоичным переключателем, но практически любой двоичный файл не будет работать. Вы не можете просто скопировать байты из двух двоичных файлов и ожидать, что они будут работать, потому что двоичные файлы обычно имеют заголовки, метаданные, структуры данных и т.д., Которые определяют формат файла. Если вы делаете бинарную копию, вы просто будете копировать все байты, как есть, что в конечном итоге приведет к тому, что эти структуры будут размещены в местах, которых не должно быть, поэтому, когда вы откроете их, у функции синтаксического анализа возникнут проблемы, и вы увидите, что по сути поврежденные данные. , Некоторые программы игнорируют части, которые не имеют смысла, и просто показывают, что они могут (что позволяет работать стереографию), но некоторые выдают ошибку и жалуются, что файл поврежден. Способность обнаруживать повреждение зависит от типа файла.

В качестве примера, давайте изобретем упрощенный формат PDF:

Byte(s)    Meaning
---------------------

File header:
0-1        # of Pages
2-3        Language
4-5        Font
6-EOF      Data (each page encoded separately)

Page data:
0-1        Page number
2-3        # of characters on page
4-#chars   Letters contained on the page

Как видите, каждый файл будет содержать заголовок уровня файла с некоторой общей информацией, за которой следуют блоки данных для каждой страницы, содержащей данные страницы. Если вы затем возьмете два файла, каждый из которых содержит одну страницу, и объедините их в двоичные файлы, вы не будете создавать один двухстраничный файл, а вместо этого один испорченный файл, который начинается с одной страницы, а затем содержит кучу мусора (файл заголовок не имеет смысла, когда программа пытается прочитать вторую страницу).

То же самое происходит с вашими MP3. Когда вы объединяете их таким образом, теги ID3 в начале и / или конце второго файла сохраняются, и когда проигрыватель пытается прочитать следующий кадр, он ожидает аудиоданные, но находит заголовок второй файл, который не соответствует ожидаемому формату для аудиоданных, поэтому он не знает, что делать. Некоторые проигрыватели будут воспроизводить заголовок в виде аудиоданных (которые, вероятно, будут воспроизводиться как статические / шумовые / попсовые / и т.д.), некоторые будут обрезать звук до следующего правильного кадра, некоторые могут вообще прекратить воспроизведение песни, а некоторые могут даже вылететь. ,

Команда copy ничего не знает о типах файлов, кроме обычного текста (и даже тогда, только текста ASCII), поэтому только обычный текст может быть правильно скомбинирован с ним. Двоичные файлы должны быть объединены с помощью редактора, который знает, как правильно анализировать и интерпретировать содержимое.

1

Давным-давно в старые добрые времена Win ME я просто объединял видеоклипы. Он не работал все время, но иногда работал.

Это пример команды, которую я использовал:

copy /b movie1.mpg + movie2.mpg + movie3.mpg movie4.mpg

Если фильмы не слишком большие и все одинакового типа, частоты кадров и т.д., Они обычно сливаются безупречно. В последнее время ничего подобного не пробовал.

1

В вашем примере, с MP3, это, вероятно, даст странное поведение из-за того, как MP3 кодируются. Например, теги ID3v1 - это последние 128 байтов MP3 (то есть исполнителя, альбома и т.д.). Эта информация не является "воспроизводимой". Когда VLC или другой медиаплеер открывает MP3, он (вероятно) будет воспроизводить первый MP3, вести себя забавно для информации, а затем, возможно, воспроизводить оставшуюся часть файла. У меня не загружена Windows сейчас, поэтому я не могу проверить наверняка.

Я бы предположил, что это то же самое, что изображения и фильмы; в зависимости от того, как файлы закодированы, зависит, как файлы будут "объединяться". Я полагаю, эта функциональность пришла со времен DOS, когда все было в простом тексте

-1

Что касается MP3, то примерно то, что после заголовка, может быть прочитано как данные. Есть такая игра, Sonic 3 в Sega Genesis и другая игра под названием Sonic & Knuckles. Оригинальный картридж Sonic & Knuckles имел слот, предназначенный для вставки других игр, но при добавлении Sonic 2 и особенно 3, возможно, контрольная сумма вызовет другой набор указателей, игра будет вести себя по-другому. На ранней стадии использования ПЗУ, когда мы хотели, чтобы два картриджа работали так, как это было в аппаратном обеспечении, мы использовали copy /b sonick.bin+sonic3.bin sonic3k.bin . Таким образом, их объединение приведет к одному большому ПЗУ, где sonick будет иметь набор инструкций (указателей), чтобы заставить его использовать ресурсы sonic3.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .