首页 > 解决方案 > 如何使用点网语言区分二进制文件和文本文件

问题描述

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

例如,诸如“ http://microsoft.com/HowToUseAzure.pdf ”之类的 URL 很可能是 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 进行一些智能解析,最后得到第一部分:

http://www.sciencedirect.com/science

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

1) 文本 2) pdf 3) html?

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

谢谢。

标签: html.netpdfbinaryfile-type

解决方案


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

请允许我引用 ISO 32000-1:

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

和 ISO 32000-2:

PDF 文件以 5 个字符“%PDF–”开头,偏移量应从 PERCENT SIGN (25h) 计算。

有什么不同?%PDF-1.0当您遇到以to开头的文件时%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 文件。他们只发送每个字节的前 7 位,而不是发送 8 位字节(这有时被称为“字节剃须”)。发生这种情况时,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。在许多情况下,文本文件不知道使用了哪种编码,因为编码不会存储为文件的属性。


推荐阅读