數據恢復軟件(五):用C語言重寫了C++的擴展程序.

這個程序與上個C++的程序實現的功能完全相同.寫這個程序的目的是兩個:第一可以比較一下C與C++的語言寫法的不同.第二比較一下兩種寫法誰的速度更快.有興趣的朋友可以比較一下.

#include <windows.h>
#include <iostream>
using namespace std;
#define MAXSIZE 5*1024*1024
HANDLE f;
DWORD fsize;
UINT fpoint;
struct BmpHeader{
    WORD ND;
    WORD TYPE;
    UINT size;
    WORD r1;
    WORD r2;
    }bh;
const unsigned char PngHeader[8] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
const unsigned char PngFooter[8] = { 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };
VOID Read(void* lpBuf,UINT nCount)
{
    DWORD Num;
    ::SetFilePointer(f,fpoint,NULL,FILE_BEGIN);
    ::ReadFile(f,lpBuf,nCount,&Num,NULL);
}
VOID Write(LPCTSTR lp,void* lpBuf,UINT nCount)
{
    DWORD Num;
    HANDLE fout;
    fout=::CreateFile(lp,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    ::WriteFile(fout,lpBuf,nCount,&Num,NULL);
    CloseHandle(fout);
}
VOID BmpGetName(char* c)
{
    sprintf(c,"%d.bmp",fpoint);
      
}
VOID PngGetName(char* c)
{
    sprintf(c,"%d.png",fpoint);
      
}
VOID Recover(UINT nCount,char* c)
{
    char *dout=new char[nCount];
    Read(dout,nCount);
    Write(c,dout,nCount);
    delete [] dout;
}
UINT BmpComRaw()
{
    Read(&(bh.TYPE),10) ;
    if(bh.TYPE==MAKEWORD('B','M')&&bh.r1==0&&bh.r2==0)
    {
        char fname[20];
        BmpGetName(fname);
        Recover(bh.size,fname);
        return bh.size;
    }
    else
    {
        return 0;
    }
}
UINT PngComRaw()
{
    CHAR temp[8];
    Read(temp,8) ;
    for(int i=0;i<8;i++)
    {
        if (temp[i]!=PngHeader[i])
        {
            break;
        }
        if (i==7)
        {
            CHAR *tempdata=new CHAR[MAXSIZE];
            Read(tempdata,MAXSIZE);
            CHAR *p;
            for (int i=0;i<MAXSIZE;i++)
            {
                p=tempdata+i;
                for(int j=0;j<8;j++)
                {
                    if (*(p+j)!=PngFooter[j])
                    {
                        break;
                    }
                    if (j==7)
                    {
                        char fname[20];
                        PngGetName(fname);
                        Recover(i,fname);
                        return i;
                    }
                }
            }
            delete [] tempdata;
        }
    }
    return 0;
}
VOID init(LPCTSTR lp)
{
    f=::CreateFile(lp,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(f==INVALID_HANDLE_VALUE)
    {
        cout<<"can't open file"<<endl;
        exit(0);
    }
    fsize=::GetFileSize(f,NULL);
    fpoint=0;
}
void main()
{
    init("img");
    UINT(*r[2])()={BmpComRaw,PngComRaw};
    while(fpoint<fsize)
    {
        for (int j=0;j<sizeof(r)/sizeof(r[0]);j++)
        {
            (*r[j])();
        }
        fpoint+=512;
    }
    cout<<"scan end"<<endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章