Как я могу различить двоичный файл и текстовый файл, используя языки dot-net - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть программа Visual Basic, которая загружает отдельные файлы из Интернета. Эти файлы могут быть PDF-файлами, или они могут быть настоящими веб-страницами, или они могут быть текстовыми. Обычно я не сталкиваюсь ни с каким другим типом файла (кроме, возможно, изображений). Может показаться, что легко узнать, какой тип файла я загружаю, просто протестируйте расширение URL.

Например, такой URL, как "http://microsoft.com/HowToUseAzure.pdf", скорее всего, будет PDF. Но некоторые URL не выглядят так. Я встречал такой, который был похож на это:

http://www.sciencedirect.com/science?_ob=MImg&amp _imagekey=B6VMC-4286N5V-6-18&amp _cdi=6147&amp _orig=search&amp _coverDate=12%2F01%2F2000&amp _qd=1&amp _sk=999059994&amp wchp=dGLSzV-lSzBV&amp _acct=C000000152&amp _version=1&amp _userid=4429&amp md5=d4d53f46bdf6fb8c7431f4a2e04876e7&amp ie=f.pdf 

Я могу сделать несколько интеллектуальных разборов этого URL, и в итоге получаю первую часть:

и вторая часть - знак вопроса и все, что после него. В этом случае первая часть не говорит мне, какой тип файла у меня есть, хотя вторая часть имеет подсказку. Но вторая часть может быть произвольной. Итак, мой вопрос, что мне делать в этой ситуации? Могу ли я загрузить файл как «двоичный» и затем проверить «двоичные» байты, которые я получаю, чтобы увидеть, есть ли у меня

1) текст 2) pdf 3) html?

Если да, то что такое тест? В чем разница между «двоичным» и «pdf» и «текстовым» в любом случае - есть ли в двоичном файле некоторые байтовые значения, которые просто не встречаются в html-файле - или в файле Unicode, или в pdf-файле?

Спасибо.

1 Ответ

0 голосов
/ 18 сентября 2018

Как определить, находится ли файл в формате PDF?

Позвольте мне процитировать ISO 32000-1:

Первая строка файла PDF должна быть заголовкомсостоящий из 5 символов% PDF–, за которым следует номер версии в форме 1.N, где N - это цифра от 0 до 7.

И ИСО 32000-2:

Файл PDF начинается с 5 символов «% PDF–», а смещения должны рассчитываться по знаку ПРОЦЕНТ (25h).

В чем разница?Когда вы сталкиваетесь с файлом, который начинается с %PDF-1.0 до %PDF-1.7, у вас есть файл ISO 32000-1;начиная с ISO 32000-2, файл PDF также может начинаться с %PDF-2.0.

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

Это также объясняется в ISO 32000:

Если PDF-файл содержит двоичные данные, как это делают большинство, за строкой заголовка должна немедленно следовать строка комментария, содержащая не менее четырех двоичных символов, то есть символов, коды которых составляют 128 или более.Это обеспечивает правильное поведение приложений передачи файлов, которые проверяют данные в начале файла, чтобы определить, следует ли рассматривать содержимое файла как текст или как двоичный файл.

Если вместо этого открыть PDF в текстовом редактореВ средстве просмотра PDF вы часто увидите, что вторая строка выглядит следующим образом:

%âãÏÓ

Не существует такого понятия, как «простой текстовый файл»;файл всегда имеет кодировку.Однако, когда люди говорят о простых текстовых файлах, они часто имеют в виду говорить файлы ASCII.Файлы ASCII - это файлы, у которых все байты имеют значение меньше 128 (10000000).

В старые времена протоколы передачи часто рассматривали документы PDF, как если бы они были файлами ASCII.Вместо того, чтобы отправлять 8-битные байты, они отправляли только первые 7-битные байты (это иногда называют «байтовым преобразованием»).Когда это происходит, байты ASCII файла PDF сохраняются, но весь двоичный контент поврежден.Когда вы открываете такой PDF-файл в программе просмотра PDF, вы видите страницы файла PDF, но каждая страница пуста.

Чтобы избежать этой проблемы, в заголовок PDF-файла добавляются четыре не-ASCII символа.Протоколы передачи проверяют первую серию байтов, видят, что некоторые из этих байтов имеют значение выше 127 (01111111), и поэтому обрабатывают файл как двоичный файл.

Как определить, является ли файлв формате HTML?

Это более сложно, так как HTML позволяет людям быть небрежными.Можно ожидать, что первое непустое пространство HTML-файла будет символом <, но такой файл также может быть простым XML-файлом, не имеющим формат HTML.

Вы быожидайте <!doctype html>, <html> или <body> где-нибудь в файле (с атрибутами или без атрибутов внутри тега), но некоторые люди создают файлы HTML без упоминания DocType и даже без тега <html> или <body>.

Обратите внимание, что файлы HTML могут входить в различные кодировки.Например: когда они кодируются с использованием UTF-8, они будут содержать байты со значением больше 127.

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

Просто зациклитьсявсе байты.Если вы найдете байт со значением, превышающим 127, у вас есть файл не в формате ASCII.

А как насчет файлов в Unicode?

В этом случае будет байтМарка заказа (BOM), позволяющая определить кодировку файла.Подробнее об этом здесь .

Есть ли другие кодировки?

Конечно, есть!См., Например, ISO / IEC 8859 .Во многих случаях текстовый файл не знает, какая кодировка использовалась, поскольку кодировка не сохраняется как свойство файла.

...