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

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

Мне показалось немного терпения!

51
задан casperOne 1 May 2012 в 00:55
поделиться

5 ответов

Я бы, вероятно, поискал множество управляющих символов, которые обычно присутствуют в двоичном файле, но редко в текстовом файле. Двоичные файлы, как правило, используют 0 достаточно, чтобы просто проверить множество 0 байтов, вероятно, было бы достаточно для обнаружения большинства файлов. Если вы заботитесь о локализации, вам также необходимо протестировать многобайтовые шаблоны.

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

21
ответ дан 7 November 2019 в 10:07
поделиться

Есть метод, называемый цепями Маркова. Просканируйте несколько файлов моделей обоих типов и для каждого байтового значения от 0 до 255 соберите статистику (в основном вероятность) следующего значения. Это даст вам профиль размером 64 КБ (256x256), с которым вы сможете сравнить свои файлы времени выполнения (в пределах% порогового значения).

Предположительно, именно так работает функция автоматического определения кодирования браузеров.

31
ответ дан 7 November 2019 в 10:07
поделиться

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

Чтобы учесть юникод, не забудьте отметить кодировку в вашем потоке как таковую.

Это действительно неоптимально, но вы сказали быстро и грязно.

2
ответ дан 7 November 2019 в 10:07
поделиться

Быстро и грязно - использовать расширение файла и искать общие текстовые расширения, такие как .txt. Для этого можно использовать вызов Path.GetExtension . Все остальное не может быть классифицировано как «быстрое», хотя вполне может быть грязным.

4
ответ дан 7 November 2019 в 10:07
поделиться

http://codesnipers.com/?q=node/68 описывает, как определить UTF-16 по сравнению с UTF-8 с помощью метки порядка байтов (которая может появиться в вашем файл). Он также предлагает пройти через несколько байтов, чтобы проверить, соответствуют ли они шаблону многобайтовой последовательности UTF-8 (ниже), чтобы определить, является ли ваш файл текстовым.

  • 0xxxxxxx ASCII <0x80 (128)
  • 110xxxxx 10xxxxxx 2-байтовый> = 0x80
  • 1110xxxx 10xxxxxx 10xxxxxx 3-байтовый> = 0x400
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4-байтовый> = 0x10000
1
ответ дан 7 November 2019 в 10:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: