0

.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()返しますが、およびの場合はを返します。ファイルのコンソール出力は次のとおりです。TRUEPDFs.docx.pptxFALSE.doc.ppt.doc

FFFFFFD0
FFFFFFCF
11
FFFFFFE0
FFFFFFA1
FFFFFFB1
1A
FFFFFFE1

各行は、sig の char の 16 進数に対応します。.doc最後のバイトはファイルの署名と同じであることに注意してください。これらのエクストラがここに存在する理由はわかりませんFFFFFF。何が問題なのですか??

4

1 に答える 1

1

の問題についてはFFFFFFFF、これらの数値の最後のバイトが より大きいことに気付くかもしれません0x7f。これは、符号付きバイトが負であることを意味します。したがって、符号付きを使用してcharおり、値を出力するときにコンパイラがそれを符号拡張します。

に変更する必要がありますunsigned char(または、さらに良いことに、標準タイプuint8_t)。

于 2013-05-29T13:49:30.047 に答える