一个DLL文件,大小不定。 用WINHEX查看16进制内容很多多很多多,然后我想写个小程序想把这些16进制内容,以字符串形式打印出来。并存放在一个文本文件。比如 16进制: 4D3164然后我想 打印这个 字符串。我用了一个网上例子,效率太低了。我自己也写了一个速度也不行。 转换100多KB的DLL文件,竟然要1分多钟!

解决方案 »

  1.   

    void CTestDlg1Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CFile fp;
    BOOL bStatus=fp.Open("Test.Dll",CFile::modeRead|CFile::typeBinary);
    UCHAR pEnter[]={0x0D,0x0A};
    UCHAR cCode[6];
    if (bStatus)
    {
    INT32 iLength=fp.GetLength();
    PUCHAR pBuffer=new UCHAR[iLength];
    if (pBuffer)
    {
    fp.Read((void*)pBuffer,iLength);
    fp.Close();
    bStatus=fp.Open("Test.Txt",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    if (bStatus)
    {
    int iTemp;
    for (iTemp=0;iTemp<iLength;iTemp++)
    {
    if (iTemp%16==0)
    fp.Write((void*)pEnter,2);
    sprintf((CHAR*)&cCode,"0x%.2x,",pBuffer[iTemp]);
    fp.Write((void*)&cCode,5);
    }
    fp.Close();
    }
    delete []pBuffer;
    }
    }
    AfxMessageBox("Finished");
    }
    刚测试过.
      

  2.   

    如果不要输出的0x??,中的0x,可以
    sprintf((CHAR*)&cCode,"%.2x,",pBuffer[iTemp]);
    对应写入长度为3
      

  3.   

    CFile file;
    file.Open("c:\\a.dll", CFile::modeReadWrite | CFile::typeBinary);
    int nLen = file.GetLength();
    char *pContent = new char[nLen];
    file.Read(pContent, nLen);
    file.Close(); file.Open("C:\\a.txt", CFile::modeReadWrite | CFile::modeCreate);
    CString str;
    for (int i=0; i<nLen; i++)
    {
    str.Format("%02X", pContent[i]);
    file.Write(str, 2);
    }
    file.Close();
    delete pContent;我这样转一个300多K的DLL,几要几秒
      

  4.   

    另外错了一点,在if (pBuffer)后加else,fp.Close();
      

  5.   

    TO MSDN3000(八门金锁)
    你这个效率好快噢。不过怎么转换过来呀。不过,你的方式和我想发有些冲突,你写进文本有乱码。我 只是想 打印16进制:4DFFEA 这样的形式。
      

  6.   

    有乱码??难道是CHAR和UCHAR的问题?大于了0x7F??
    我等下试一试...转换回来是一个hex to bin的问题,同样的读入转换写入
      

  7.   

    测试了几个文件,从0x00到0xFF的范围都没有乱码现象...
    只想写4DFFEA这样的,可以修改
    sprintf((CHAR*)&cCode,"0x%.2x,",pBuffer[iTemp]);
    sprintf((CHAR*)&cCode,"%.2x",pBuffer[iTemp]);
    当然对应写入文件的长度为2
    fp.Write((void*)&cCode,2);
      

  8.   

    能不能写个转换回来呀?
    你现在写个是这个样的
    0x04 0x8b 0x44 0x24 0x04 0x3b 0x04 0x24 0x76 0x5f 0x8b 0xcb 0x8b 0x54 0x24 0x04
      

  9.   

    这样吧,楼主需要4D5A之类的,那么转换的时候sprintf((CHAR*)&cCode,"%.2x",pBuffer[iTemp]);再fp.Write((void*)&cCode,2);
    转换回来使用下面的代码,只是参考,转换苯了点:
    void CTestDlg1Dlg::OnButton2() 
    {
      // TODO: Add your control notification handler code here
      CFile fp;
      BOOL bStatus=fp.Open("Test.txt",CFile::modeRead|CFile::typeBinary);
      UCHAR cCode[2],cTempCode[2];
      if (bStatus)
      {
        INT32 iLength=fp.GetLength();
        PUCHAR pBuffer=new UCHAR[iLength];
        if (pBuffer)
        {
          fp.Read((void*)pBuffer,iLength);
          fp.Close();
          bStatus=fp.Open("Test.Dll",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
          if (bStatus)
          {
            for (int iTemp=0;iTemp<iLength;iTemp+=2)
            {
              if (iTemp>iLength-4)
                iTemp=iTemp;
              if (pBuffer[iTemp]>=0x61)
                cTempCode[0]=pBuffer[iTemp]-0x57;
              else if (pBuffer[iTemp]>=0x41)
                cTempCode[0]=pBuffer[iTemp]-0x37;
              else if (pBuffer[iTemp]>=0x30)
                cTempCode[0]=pBuffer[iTemp]-0x30;
              if (pBuffer[iTemp+1]>=0x61)
                cTempCode[1]=pBuffer[iTemp+1]-0x57;
              else if (pBuffer[iTemp+1]>=0x41)
                cTempCode[1]=pBuffer[iTemp+1]-0x37;
              else if (pBuffer[iTemp+1]>=0x30)
                cTempCode[1]=pBuffer[iTemp+1]-0x30;
              cCode[0]=(cTempCode[0]<<4)|(cTempCode[1]);
              fp.Write((void*)&cCode,1);
            }
            fp.Close();
          }
          delete []pBuffer;
        }
        else
          fp.Close();
      }
      AfxMessageBox("Finished");
    }
    类似0x00,0x11,0x22等格式,在转换的时候:
    for (int iTemp=0;iTemp<iLength;iTemp+=2)
    改为
    for (int iTemp=0;iTemp<iLength;iTemp+=5)if (pBuffer[iTemp]>=0x61)和if (pBuffer[iTemp+1]>=0x61)的条件判断改为
    (pBuffer[iTemp+2]>=0x61)和if (pBuffer[iTemp+3]>=0x61),else if里面类似
    即可