快速判断文件是文本文件或二进制文件 .
来源:互联网 发布:c 语言declaration 编辑:程序博客网 时间:2024/04/28 09:02
判断一个文件是文本文件还是二进制文件可以帮助压缩软件针对不同文件选择对应的算法,那么如何判断一个文件是是文本还是二进制呢?
旧版本的pkzip使用的方法是:如果80%以上的字节都落在7..127的范围里,就认为它是文本文件,否则它就是二进制文件。代码如下:
- int isPlainText(const char *filename)
- {
- FILE *fp = fopen(filename, "rb");
- long file_length;
- long plain_text_char_count = 0;
- long binary_char_count = 0;
- int read_len;
- unsigned char byte;
- fseek(fp, 0, SEEK_END);
- file_length = ftell(fp);
- fseek(fp, 0, SEEK_SET);
- while ((read_len = fread(&byte, 1, 1, fp)) > 0)
- {
- if (byte >= 7) plain_text_char_count++;
- else binary_char_count++;
- }
- fclose(fp);
- return (plain_text_char_count / file_length > 0.8) ? 1 : 0;
- }
但是这个方法有一些缺陷,比如有的文件里包含了一些128..255里的字母,比如希腊语字母,或者这个文件使用其他语言编码包括了汉字等多字节字符甚至使用Unicode编码就无法判断了。所以下面介绍一种用在zlib上的新方法,,可以判断ASCII,Unicode,以及其他一些宽字符集。
这个算法把一个字节的数据放入三个名单:
白名单:
9 (TAB), 10 (LF), 13 (CR), 32..255
灰名单:
7 (BEL), 8 (BS), 11(VT), 12 (FF), 26 (SUB), 27 (ESC)
黑名单:
0..6, 14..31
判断的方法是:
如果一个文件包含至少一个白名单中的字节而且不包含一个黑名单中的字节,那么它就是文本文件,否则它是二进制文件。
算法原理很简单,凡是出现了黑名单中的字节的文件几乎只可能是二进制文件,而普通的文本文件几乎不可能出现这些字节,即使是Unicode等多字节编码也会设置高位的标记字符以实现兼容ASCII。
代码如下:
- int isPlainText2(const char *filename)
- {
- FILE *fp = fopen(filename, "rb");
- long white_list_char_count = 0;
- int read_len;
- unsigned char byte;
- while ((read_len = fread(&byte, 1, 1, fp)) > 0)
- {
- if (byte == 9 || byte == 10 || byte == 13 || (byte >= 32 && byte <= 255))
- white_list_char_count++;
- else if ((byte <= 6) || (byte >= 14 && byte <= 31))
- return 0;
- }
- fclose(fp);
- return (white_list_char_count >= 1) ? 1 : 0;
- }
参考资料:<<A Fast Method for Identifying Plain Text Files>> by Cosmin Truta updated in 2006-May-28
- 快速判断文件是文本文件或二进制文件
- 快速判断文件是文本文件或二进制文件 .
- AAuto_如何快速判断文件是二进制文件还是文本文件
- 判断文件是二进制文件还是文本文件的函数(VC,Delphi)
- 判断文件是二进制文件还是文本文件的函数
- 判断一个文件为文本文件还是二进制文件
- 判断文件是否文本文件还是二进制文件的两个有效方法
- 【原创】如何判断文件为文本文件还是二进制文件
- 读写文件(二进制文件、文本文件、ini文件)
- 二进制文件和文本文件及其文件读写
- 文本文件 二进制文件
- 文本文件二进制文件
- 文本文件 二进制文件
- 快速判断INT类型某位是1或0!
- C++快速判断二进制某位是1或0
- PHP取二进制文件头快速判断文件类型
- 如何判断Linux的tar.gz是二进制文件还是源码文件
- 如何判断Linux的tar.gz是二进制文件还是源码文件
- C++中避免内存泄漏的几个绝招(二)
- 文件
- Android中的ellipsize
- 境界
- 对String类型的小数进行取位数
- 快速判断文件是文本文件或二进制文件 .
- 一款自制的视频录制软件
- Heroku上Toto加载HTML页面不全问题解决办法
- 计算机分类:
- 16条技巧让你更高效使用SSH(1)转自51cto
- Spring中静态类使用
- Linux进程间通信
- C#中winform,webform多层架构理解
- CXF学习笔记1