征求高效率文件内容转换内容,放100分。 一个DLL文件,大小不定。 用WINHEX查看16进制内容很多多很多多,然后我想写个小程序想把这些16进制内容,以字符串形式打印出来。并存放在一个文本文件。比如 16进制: 4D3164然后我想 打印这个 字符串。我用了一个网上例子,效率太低了。我自己也写了一个速度也不行。 转换100多KB的DLL文件,竟然要1分多钟! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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");}刚测试过. 如果不要输出的0x??,中的0x,可以sprintf((CHAR*)&cCode,"%.2x,",pBuffer[iTemp]);对应写入长度为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,几要几秒 另外错了一点,在if (pBuffer)后加else,fp.Close(); TO MSDN3000(八门金锁)你这个效率好快噢。不过怎么转换过来呀。不过,你的方式和我想发有些冲突,你写进文本有乱码。我 只是想 打印16进制:4DFFEA 这样的形式。 有乱码??难道是CHAR和UCHAR的问题?大于了0x7F??我等下试一试...转换回来是一个hex to bin的问题,同样的读入转换写入 测试了几个文件,从0x00到0xFF的范围都没有乱码现象...只想写4DFFEA这样的,可以修改sprintf((CHAR*)&cCode,"0x%.2x,",pBuffer[iTemp]);sprintf((CHAR*)&cCode,"%.2x",pBuffer[iTemp]);当然对应写入文件的长度为2fp.Write((void*)&cCode,2); 能不能写个转换回来呀?你现在写个是这个样的0x04 0x8b 0x44 0x24 0x04 0x3b 0x04 0x24 0x76 0x5f 0x8b 0xcb 0x8b 0x54 0x24 0x04 这样吧,楼主需要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里面类似即可 ListCtrl添加CheckBox VC++ 视频数据的存储与转发 求Visual C++ 网络高级编程 代码光盘 一个调用对象的问题 问一个定义消息的问题。 数据传送! 关于动态生成odbc的一条语句 我從CWinThread類繼承一個新類CMyThd之後,為何構造函數是保護的? 创建的组件为什么挪个地方就不可以用了? 最近看《com原理与应用》的第7章‘结构化存储’,不明白永久对象和存储对象流对象是什么关系? 同一个标准C++程序在CB上运行完全通过,在VC上运行却出现一个错误?????? ComboBox中选择改变事件的问题
{
// 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");
}
刚测试过.
sprintf((CHAR*)&cCode,"%.2x,",pBuffer[iTemp]);
对应写入长度为3
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,几要几秒
你这个效率好快噢。不过怎么转换过来呀。不过,你的方式和我想发有些冲突,你写进文本有乱码。我 只是想 打印16进制:4DFFEA 这样的形式。
我等下试一试...转换回来是一个hex to bin的问题,同样的读入转换写入
只想写4DFFEA这样的,可以修改
sprintf((CHAR*)&cCode,"0x%.2x,",pBuffer[iTemp]);
sprintf((CHAR*)&cCode,"%.2x",pBuffer[iTemp]);
当然对应写入文件的长度为2
fp.Write((void*)&cCode,2);
你现在写个是这个样的
0x04 0x8b 0x44 0x24 0x04 0x3b 0x04 0x24 0x76 0x5f 0x8b 0xcb 0x8b 0x54 0x24 0x04
转换回来使用下面的代码,只是参考,转换苯了点:
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里面类似
即可