Обнаружение, является ли файл двоичным или простым текстом? - PullRequest
4 голосов
/ 27 мая 2010

Как я могу определить, является ли файл двоичным или простым текстом?

В основном мое приложение .NET обрабатывает пакетные файлы и извлекает данные, однако я не хочу обрабатывать двоичные файлы.

В качестве решения я подумываю проанализировать первые X байтов файла и, если число печатных символов превышает число печатаемых, он должен быть двоичным.

Это правильный способ сделать это? Есть ли лучшая реализация для этой задачи?

Ответы [ 4 ]

6 голосов
/ 27 мая 2010

Что именно вы подразумеваете под двоичным?Вам написано «Искусство войны» на китайском языке?А как насчет японско-английского словаря?

На самом деле нет 100% пути.

Вам может понадобиться какая-то эвристика.

Некоторые варианты могут выглядеть так:

Если указано выше (особенно подписи и расширения файлов)не помогите, затем попытайтесь угадать, основываясь на наличии / отсутствии определенных байтов (как вы делаете).

Примечание: лучше сначала проверить расширения / подписи, так как вам нужно только прочитатьнесколько байтов / метаданных файла, и это будет довольно эффективно по сравнению с фактическим чтением всего файла.

4 голосов
/ 27 мая 2010
Команда

Unix file делает это умным способом. Конечно, это намного больше, но вы можете проверить алгоритм здесь и затем создать что-то специализированное.


ОБНОВЛЕНИЕ: Ссылка выше, кажется, не работает. Попробуйте это .

0 голосов
/ 27 мая 2010

Я думаю, что лучший способ сделать это - взять не более первых байтов X из файла (X может быть 256, 512 и т. Д.), Подсчитать количество символов, которые не используются файлами ASCII (разрешены коды ASCII) являются: 10, 13, 32-126). Если вы точно знаете, что сценарий написан на английском языке, ни один символ не может быть за пределами указанного набора. Если вы не уверены в языке, вы можете разрешить не более Y символов выходить за пределы набора (если X 512, я бы выбрал Y 8 или 10).

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

0 голосов
/ 27 мая 2010

Вы можете пересмотреть первое число байтов X и дать правильное совпадение, если все байты находятся в правильном классе символов . Но это может предполагать, что вы знаете кодировку.

...