[英]MS Office Files are not recognized by comparing signatures
我需要檢查文件是否為.doc
, .ppt
, .pdf
或其他文件。 我寫了以下代碼:
bool CheckFile(string path)
{
char * sig;
sig = new char[8];
ifstream myfile;
myfile.open(path.c_str(), ios::in | ios::binary);
if (myfile.fail())
{
MessageBox(0,"File Not Opened","ERROR",MB_OK);
break;
}
myfile.read(sig,8);
//docx, pptx, xlsx
if ((sig[0] == (0x50))&&(sig[1] == (0x4B))&&(sig[2] == (0x03))&&(sig[3] == (0x04))&&(sig[4] == (0x14))&&(sig[5] == (0x00))&&(sig[6] == (0x06))&&(sig[7] == (0x00)))
{
return true;
}
//doc, ppt, xls
if ((sig[0] == (0xD0))&&(sig[1] == (0xCF))&&(sig[2] == (0x11))&&(sig[3] == (0xE0))&&(sig[4] == (0xA1))&&(sig[5] == (0xB1))&&(sig[6] == (0x1A))&&(sig[7] == (0xE1)))
{
return true;
}
//pdf
if ((sig[0] == (0x25))&&(sig[1] == (0x50))&&(sig[2] == (0x44))&&(sig[3] == (0x46)))
{
return true;
}
delete sig;
myfile.close();
return false;
}
我在互聯網上查詢后發現,我們可以比較簽名,即MS Office文件為前8個字節, PDFs
前4個字節。 在上面的代碼中,我正在做同樣的事情。 對於PDFs
和Office 2007格式(包括.docx
和.pptx
CheckFile()
返回TRUE
,而對於.doc
和.ppt
返回FALSE
。 .doc
文件的控制台輸出為:
FFFFFFD0
FFFFFFCF
11
FFFFFFE0
FFFFFFA1
FFFFFFB1
1A
FFFFFFE1
每行對應於sig中char的十六進制。 請注意,最后一個字節與.doc
文件的簽名相同。 我不知道為什么這些多余的FFFFFF
出現在這里。 可能是什么問題呢 ??
至於FFFFFFFF
的問題,您可能會注意到這些數字的最后一個字節大於0x7f
,這意味着對於一個有符號字節,它們為負數。 因此,您使用的是帶符號的char
並且在打印值時,編譯器會對其進行符號擴展。
您應該更改為unsigned char
(或者甚至更好,標准類型uint8_t
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.