如何使用 dot-net 语言区分二进制文件和文本文件



我有一个Visual Basic程序,可以从互联网上下载单个文件。 这些文件可以是 PDF,也可以是实际网页,也可以是文本。 通常我不会遇到任何其他类型的文件(图像除外(。 知道我正在下载的文件类型似乎很容易,只需测试 URL 的扩展名即可。

例如,诸如"http://microsoft.com/HowToUseAzure.pdf"之类的 URL 可能是 PDF。 但有些网址看起来不是那样的。 我遇到了一个看起来像这样的:

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 进行一些智能解析,最后我得到了第一部分:

http://www.sciencedirect.com/science

第二部分,是问号和它之后的一切。 在这种情况下,第一部分没有告诉我我拥有什么类型的文件,尽管第二部分确实有线索。 但第二部分可能是任意的。 所以我的问题是,在这种情况下我该怎么办? 我可以将文件下载为"二进制",然后测试我得到的"二进制"字节,看看我是否有

1( 文本 2( pdf 3( html?

如果是这样,测试是什么? 无论如何,"二进制"和"pdf"和"文本"之间有什么区别 - 二进制文件中是否有一些字节值根本不会出现在html文件中 - 或Unicode文件或pdf文件中?

谢谢。

如何检测文件是否为 PDF 格式?

请允许我引用ISO 32000-1:

PDF

文件的第一行应是一个标题,由 5 个字符 %PDF 组成,后跟 1.N 形式的版本号,其中 N 是 0 到 7 之间的数字。

和 ISO 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 位(这有时称为"字节缩减"(。发生这种情况时,PDF 文件的 ASCII 字节将被保留,但所有二进制内容都会损坏。当您在 PDF 查看器中打开此类 PDF 时,您会看到 PDF 文件的页面,但每个页面都是空的。

为了避免此问题,在 PDF 标头中添加了四个非 ASCII 字符。传输协议检查第一个字节序列,看到其中一些字节的值高于 127 (01111111(,因此将文件视为二进制文件。

如何检测文件是否为 HTML 格式?

这更棘手,因为HTML允许人们马虎。您希望 HTML 文件的第一个非空格是<字符,但此类文件也可以是不是 HTML 格式的简单 XML 文件。

您希望文件中的某个位置有<!doctype html><html><body>(标签内有或没有属性(,但有些人创建 HTML 文件时没有提及 DocType,甚至没有<html><body>标签。

请注意,HTML 文件可以有许多不同的编码。例如:当它们使用 UTF-8 编码时,它们将包含值高于 127 的字节。

如何检测文件是否为 ASCII 文本文件?

只需遍历所有字节。如果找到值大于 127 的字节,则文件不是 ASCII 格式。

Unicode 中的文件呢?

在这种情况下,将有一个字节顺序标记 (BOM( 允许您检测文件的编码。在此处阅读更多相关信息。

还有其他编码吗?

当然有!例如,参见 ISO/IEC 8859。在许多情况下,文本文件不知道使用了哪种编码,因为编码不会存储为文件的属性。

最新更新