检测文件是二进制还是纯文本?

时间:2010-05-27 17:15:55

标签: .net file binary format

如何检测文件是二进制还是纯文本?

基本上我的.NET应用程序正在处理批处理文件和提取数据但是我不想处理二进制文件。

作为一种解决方案,我正在考虑分析文件的前X个字节,如果有不可打印的字符而不是可打印的字符,那么它应该是二进制的。

这是正确的方法吗?这项任务有更好的实施吗?

4 个答案:

答案 0 :(得分:6)

二进制是什么意思? “战争的艺术”是用中文二进制写的吗?日英词典怎么样?

没有真正的100%方式。

您需要使用某种启发式方法。

可能需要考虑一些选项:

如果以上(特别是文件签名和扩展名)没有帮助,那么尝试根据某些字节的存在/不存在进行猜测(就像你正在做的那样)。

注意:最好首先检查扩展/签名,因为您只需要读取几个字节/文件元数据,与实际读取整个文件相比,这将非常有效。

答案 1 :(得分:4)

Unix file命令以巧妙的方式执行此操作。当然,它做了很多,但你可以检查算法here,然后构建一些专门的。


更新:上面的链接似乎已被破坏。试试this

答案 2 :(得分:0)

你可以正则表示前X个字节数,如果所有字节都在适当的character class,则给出有效匹配。但这可能预示着你知道编码。

答案 3 :(得分:0)

我认为最好的方法是从文件中获取最多X个字节(X可以是256,512等),计算ASCII文件未使用的字符数(允许使用ascii代码)是:10,13,32-126)。如果您确定该脚本是用英语编写的,那么除了上述集合之外没有任何字符。如果你不确定这种语言,你可能最多允许Y char在集合之外(如果X是512,我会选择Y为8或10)。

如果这还不够好,你可能会使用更多的约束,例如:根据文件的语法,这些关键字应该存在(例如:对于你的批处理文件,应该有一些回声,如果,如果,转到,呼叫,退出等)