高分求答,有没有判断文件格式的源码

lspbeyond
博客专家认证
2008-11-18 07:41:57
不是根据扩展名判断,因为扩展名可以被用户修改。
基本思路是根据文件头部的特征码进行判别,但是,文件格式很多,自己写很累。
有谁知道sourceforge或者别的地方有没有成熟的源码,请告知,多谢。
...全文
134 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2008-11-20
  • 打赏
  • 举报
回复
如果没有区间,那是很复杂的,如果只判断比如图像,或音乐,虽然繁杂,总有个盼头。
还没淹死的鱼 2008-11-20
  • 打赏
  • 举报
回复
微软都没什么好办法, 还是放弃吧
lspbeyond 2008-11-20
  • 打赏
  • 举报
回复
txt这种格式是没有文件头,不过只占少数。
shanying_0 2008-11-19
  • 打赏
  • 举报
回复
恩。顶一下
  • 打赏
  • 举报
回复
有些文件没文件头的吧,比如txt之类的纯粹ASCⅡ码的文件。
zhucde 2008-11-19
  • 打赏
  • 举报
回复
这个基本很难, 你得分析文件的格式.
每增加一个格式,你得重写一个相应识别的代码.

因为文件定义并没有标准.

当然,如果只是为了判别你自己定义的文件那就好办了, 自己约束好,
直接读取识别就行了
csgdseed 2008-11-19
  • 打赏
  • 举报
回复
帮顶,这个工程很大
lspbeyond 2008-11-19
  • 打赏
  • 举报
回复
如果哪位有各种常见文件特征码的资料,能分享一下,也非常感激。
lspbeyond 2008-11-19
  • 打赏
  • 举报
回复
文件头部比较的代码,我手头就有,贴出来和大家分享下:
比如avi的特征码可以表示为:value="0,4,,52494646,8,4,,41564920" ,4个数字一段,分别表示起始字节、结束字节,mask,value

代码:
bool CheckBytes(HANDLE hFile, CString chkbytes)
{
CAtlList<CString> sl;
Explode(chkbytes, sl, ',');

if(sl.GetCount() < 4)
return false;

ASSERT(!(sl.GetCount()&3));

LARGE_INTEGER size = {0, 0};
size.LowPart = GetFileSize(hFile, (DWORD*)&size.HighPart);

POSITION pos = sl.GetHeadPosition();
while(sl.GetCount() >= 4)
{
CString offsetstr = sl.RemoveHead();
CString cbstr = sl.RemoveHead();
CString maskstr = sl.RemoveHead();
CString valstr = sl.RemoveHead();

long cb = _ttol(cbstr);

if(offsetstr.IsEmpty() || cbstr.IsEmpty()
|| valstr.IsEmpty() || (valstr.GetLength() & 1)
|| cb*2 != valstr.GetLength())
return false;

LARGE_INTEGER offset;
offset.QuadPart = _ttoi64(offsetstr);
if(offset.QuadPart < 0) offset.QuadPart = size.QuadPart - offset.QuadPart;
SetFilePointer(hFile, offset.LowPart, &offset.HighPart, FILE_BEGIN);

// LAME
while(maskstr.GetLength() < valstr.GetLength())
maskstr += 'F';

CAtlArray<BYTE> mask, val;
CStringToBin(maskstr, mask);
CStringToBin(valstr, val);

for(size_t i = 0; i < val.GetCount(); i++)
{
BYTE b;
DWORD r;
if(!ReadFile(hFile, &b, 1, &r, NULL) || (b & mask[i]) != val[i])
return false;
}
}

return sl.IsEmpty();
}
wltg2001 2008-11-18
  • 打赏
  • 举报
回复
感觉这个很难做,主要工作是对各种文件头的收集与整理工作太复杂了
ilovedrv 2008-11-18
  • 打赏
  • 举报
回复
find /usr/src -name "file.c"
yuhudie203 2008-11-18
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20060321/16/4629524.html

通过读取文件头格式来判断很麻烦 没有很好的方法

难点就在于你得知道每种文件头的共性

对于是否来判断是“某一种”文件应该还可以
ilovedrv 2008-11-18
  • 打赏
  • 举报
回复
find /usr/src -name "file.c"
ilovedrv 2008-11-18
  • 打赏
  • 举报
回复
linux下有file命令

这个有源代码

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧