
Некоторые файлы были загружены в неправильном режиме на FTP (через командную строку). Я полагаю, что у меня есть некоторые двоичные файлы, которые были загружены в режиме TEXT, и теперь я не могу их открыть.
У меня нет доступа к исходным файлам, могу ли я как-то восстановиться? Есть ли какой-то инструмент, который позволит мне получить файлы в правильном формате?
решение1
Недавно мне пришлось столкнуться с той же проблемой. Linux -> Windows, режим ASCII. Я закончил писать программу на Python, которая позволяет восстанавливать переданные ASCII-бинарные файлы. Это байтовый брутфорсер, и вот как он работает:
- Открыть поврежденный архив как поток байтов.
- Найдите все вхождения 0d, за которыми следует 0a (ASCII 13, ASCII 10).
- Удалите все вхождения 0d, за которыми следует 0a, и сохраните адреса байтов.
- Пройдитесь по каждому из адресов, чтобы восстановить несколько нулей, если они должны были быть в двоичном файле, восстановите и попробуйте открыть (в моем случае я имел дело с архивами bz2, и алгоритм контрольной суммы CRC проверял целостность несжатых данных и сопоставлял их с данными, жестко закодированными в архиве).
Число возможных допустимых пар байтов 0d 0a в двоичном файле не будет очень большим; вероятность того, что двоичный файл будет иметь допустимую пару 0d 0a, довольно мала. Время, необходимое архиву bz2 для исправления с помощью этого метода bruteforce, составляет менее 10 секунд для файлов размером менее 100 Кб. Я не проверял это с другими типами файлов, но это возможно.
Я не буду приводить здесь код, поскольку этот вопрос не связан с программированием, а это было своего рода конкурсное задание, и я не думаю, что мне будет комфортно выкладывать исходники в открытый доступ, но если вам это нужно, пожалуйста, дайте мне знать.
Всем удачи и счастливого Рождества! :)
решение2
Чтобы знать, можно ли отменить разрушение, необходимо знать задействованные операционные системы. Последствия зависят от того, какую комбинацию операционных систем вы используете на сервере и клиенте.
Самая большая проблема — символ конца строки. Windows использует возврат каретки (значение ASCII 13), за которым следует перевод строки (значение ASCII 10), тогда как Linux использует только перевод строки.
Текстовый режим FTP-передачи переводит это. Двоичный режим — нет. Вот где происходит разрушение.
Если бы перенос происходил из Windows в Linux, было бы невозможно определить, был ли LF изначально LF или комбинацией CR-LF. Поскольку данные теряются, отмена уничтожения практически невозможна.
решение3
Как отметили другие, данные повреждены и потенциально не подлежат восстановлению.
Однако 0x0D 0x0A — не слишком распространённая последовательность байтов в большинстве двоичных форматов файлов [нужна ссылка!], поэтому стоит попробовать заменить их и посмотреть, исправит ли это файл.
Theутилита fixgzделает именно это. Несмотря на свое название, он не имеет ничего специфичного для файлов .gzip и может использоваться с любым файлом.
Удачи!