判断文件是否为二进制
来源:互联网 发布:ppt图表无法修改数据 编辑:程序博客网 时间:2024/06/04 18:55
在工作中,碰到处理STL文件,有时候拿到的文件是二进制,有时候又是ASCII, 所以
想着写个方法进行判断,然后再选择打开方式。
话不多说,上代码!
enum FileTypeEnum { FileTypeUnknown, FileTypeBinary, FileTypeText };FileTypeEnumDetectFileType(const char *filename, unsigned long length, double percent_bin){ if (!filename || percent_bin < 0) { return FileTypeUnknown; } FILE *fp = Fopen(filename, "rb"); if (!fp) { return FileTypeUnknown; } // Allocate buffer and read bytes unsigned char *buffer = new unsigned char [length]; size_t read_length = fread(buffer, 1, length, fp); fclose(fp); if (read_length == 0) { return FileTypeUnknown; } // Loop over contents and count size_t text_count = 0; const unsigned char *ptr = buffer; const unsigned char *buffer_end = buffer + read_length; while (ptr != buffer_end) { if ((*ptr >= 0x20 && *ptr <= 0x7F) || *ptr == '\n' || *ptr == '\r' || *ptr == '\t') { text_count++; } ptr++; } delete [] buffer; double current_percent_bin = (static_cast<double>(read_length - text_count) / static_cast<double>(read_length)); if (current_percent_bin >= percent_bin) { return FileTypeBinary; } return FileTypeText;}
调用示例:
DetectFileType(filename,256,0.05);
算法原来很简单:
- Up to ‘length’ bytes are read from the file, if more than ‘percent_bin’ %
- of the bytes are non-textual elements, the file is considered binary,
- otherwise textual. Textual elements are bytes in the ASCII [0x20, 0x7E]
- range, but also \n, \r, \t.
意思就是,从文件中读取一段字符串,并统计字符串中非文本字符的数量,如果超过
字符串长度的百分之percent_bin,那么就是二进制文件。
这里文本字符包括 \n \r \t 以及ASCII码值在[0x20, 0x7E]这个范围的
整个文件不需要全部读取到内存。
0 0
- 判断文件是否为二进制
- 判断文件是否为图片
- 判断文件是否为Unicode
- 判断文件是否为图片
- 判断文件是否为图片
- 判断文件是否为图片
- [LeetCode]Palindrome Number 判断二进制和十进制是否为回文
- 判断一个文件是否为csv文件
- 判断文件是否为excel文件
- node判断文件是否为加密文件
- Java 判断文件是否为图片文件
- iOS 判断文件是否为OC文件
- 判断文件是否存在,判断是否为文件夹
- 判断文件是否存在,判断是否为文件夹
- 判断是否为文件夹或者文件
- 判断是否为PE文件改进版
- 判断一个文件是否为二进制文件
- java判断文件是否为图片
- (转-原作者不详)-浅析JavaScript访问对象属性和方法及区别
- poj 2299 树状数组(离散化)求逆序数
- 数据流重定向-导出训练日志
- string insert()函数的用法
- hdu 2319
- 判断文件是否为二进制
- numpy找出array中的最大值,最小值
- Hibernate 未联网情况下不能根据dtd解析hbm.xml
- F
- SpringBoot 学习记录(十): scheduler
- 第七届 山东省ACM Proxy(SPFA+反向建边)
- strcat标准库函数
- 性能优化十六之Wake_Lock唤醒锁以及JobScheduler使用
- POJ2395Out of Hay(最小生成树Kruskal模板)