.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 オフィス ファイルの場合は最初の 8 バイト、 の場合は最初の 4 バイトPDFs
です。上記のコードで、私は同じことをしています。およびを含む Office 2007 形式の場合はをCheckFile()
返しますが、およびの場合はを返します。ファイルのコンソール出力は次のとおりです。TRUE
PDFs
.docx
.pptx
FALSE
.doc
.ppt
.doc
FFFFFFD0
FFFFFFCF
11
FFFFFFE0
FFFFFFA1
FFFFFFB1
1A
FFFFFFE1
各行は、sig の char の 16 進数に対応します。.doc
最後のバイトはファイルの署名と同じであることに注意してください。これらのエクストラがここに存在する理由はわかりませんFFFFFF
。何が問題なのですか??