当前位置:  开发笔记 > 编程语言 > 正文

如何将文件内容标识为ASCII或二进制文件

如何解决《如何将文件内容标识为ASCII或二进制文件》经验,为你挑选了6个好方法。

如何使用C++将文件内容标识为ASCII或二进制文件?



1> Daniel Cassi..:

如果文件包含十进制字节9-13,32-126,则它可能是纯ASCII文本文件.否则,事实并非如此.但是,它可能仍然是另一种编码中的文本.

如果上述字节外,文件包含十进制字节128-255,它可能是一个8位或可变长度基于ASCII的编码的文本文件,如ISO-8859-1,UTF-8或ASCII +中文.如果没有,出于某些目的,您可以在此处停止并将文件视为二进制文件.但是,它仍可能是16位或32位编码的文本.

如果文件不满足上述约束,请检查文件的前2-4个字节是否有字节顺序标记:

如果前两个字节是十六进制FE FF,则该文件暂时为 UTF-16 BE.

如果前两个字节是十六进制FF FE,并且后面两个字节不是十六进制00 00,则该文件暂定为 UTF-16 LE.

如果前四个字节是十六进制00 00 FE FF,则该文件暂时为 UTF-32 BE.

如果前四个字节是十六进制FF FE 00 00,则该文件暂定为 UTF-32 LE.

如果通过上述检查确定了暂定编码,则只检查下面的相应编码,以确保该文件不是符合字节顺序标记的二进制文件.

如果您尚未确定暂定编码,则该文件可能仍然是其中一种编码的文本文件,因为字节顺序标记不是必需的,因此请检查以下列表中的所有编码:

如果文件包含十进制值为9-13,32-126和128或更高的大端双字节字,则该文件可能为UTF-16 BE.

如果文件包含小端值为9-13,32-126和128或更高的小端双字节字,则该文件可能为UTF-16 LE.

如果文件包含十进制值为9-13,32-126和128或更高的大端四字节字,则该文件可能是UTF-32 BE.

如果文件包含小端值为9-13,32-126和128或更高的小端四字节字,则该文件可能是UTF-32 LE.

如果在所有这些检查之后,您仍未确定编码,则该文件不是我所知道的任何基于ASCII编码的文本文件,因此对于大多数用途,您可能认为它是二进制的(它可能仍然是是一个非ASCII编码的文本文件,如EBCDIC,但我怀疑这超出了您关注的范围).



2> Johannes Sch..:

您使用带有stream.get()的普通循环遍历它,并检查您读取的字节值是否为<= 127.许多方法的一种方法:

int c;
std::ifstream a("file.txt");
while((c = a.get()) != EOF && c <= 127) 
    ;
if(c == EOF) {
    /* file is all ASCII */
}

但是,正如有人提到的,毕竟所有文件都是二进制文件.此外,还不清楚"ascii"的含义.如果你的意思是字符代码,那么这就是你的方式.但如果你的意思是只有字母数字值,你需要另一种方法.



3> bart..:

我的文本编辑器决定是否存在空字节.在实践中,这非常有效:没有空字节的二进制文件非常罕见.


这就是gnu diff所做的.除了他们只查看文件中的预定义长度.(不想为空字节浏览4GB文件...)

4> philant..:

看一下file命令的工作原理; 它有三种策略来确定文件的类型:

文件系统测试

魔数测验

和语言测试

根据您的平台以及您感兴趣的可能文件,您可以查看其实现,甚至可以调用它.



5> Tomalak..:

每个文件的内容都是二进制文件.所以,不知道什么,你不能确定.

ASCII是一个解释问题.如果您在文本编辑器中打开二进制文件,您会看到我的意思.

大多数二进制文件包含您可以查找的固定标头(每种类型),或者您可以将文件扩展名作为提示.如果您希望使用UTF编码的文件,则可以查找字节顺序标记,但它们也是可选的.

除非你更仔细地定义你的问题,否则不可能有明确的答案.



6> David Arno..:

如果问题是真正如何检测只是ASCII,那么litb的答案就是现实.但是,如果san在知道如何确定文件是否包含文本之后,则问题变得更加复杂.ASCII只是一种 - 越来越不受欢迎 - 表示文本的方式.Unicode系统 - UTF16,UTF32和UTF8越来越受欢迎.理论上,通过检查前两个字节是否是单字节字节顺序标记(BOM)0xFEFF(或者如果字节顺序颠倒则为0xFFFE),可以很容易地测试它们.然而,由于这两个字节搞砸了Linux系统的许多文件格式,因此不能保证它们存在.此外,二进制文件可能以0xFEFF开头.

如果文件是unicode,寻找0x00(或其他控制字符)将无济于事.如果文件是UFT16说,并且文件包含英文文本,则每隔一个字符将为0x00.

如果您知道将写入文本文件的语言,则可以分析字节并统计确定它是否包含文本.例如,英语中最常见的字母是E,后跟T.因此,如果文件中包含的E和T比Z和X更多,则可能是文本.当然,有必要将其作为ASCII和各种unicodes进行测试以确保.

如果文件不是用英文编写的 - 或者你想支持多种语言 - 那么剩下的两个选项就是查看Windows上的文件扩展名,并检查前四个字节对照"魔术文件"代码的数据库确定文件的类型,从而确定它是否包含文本.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有