Programming 版 (精华区)
发信人: SwordLea (飞刀李), 信区: Programming
标 题: [程序大战]20040720
发信站: 哈工大紫丁香 (Tue Jul 20 10:17:15 2004), 转信
程序目标:
在指定任意长度二进制文件中,查找指定最小长度(最大长度128)的连续可显示字符
——即>=32 && <= 126,并将其组织为字符串,需要记录各字符串信息如下:
DWORD dwID; // 该字符串出现序号(由0开始)
DWORD dwOffset; // 在文件中偏移
short nLength; // 该字符串长度
char* lpString; // 该字符串内容
将最终结果输出到CRichEditCtrl控件中,格式如下:
%u: Offset:%u Length:%d\t%s
dwID dwOffset nLength lpString
计时方法:
以下提供两个计时器类,都可以达到10毫秒级精确度,建议使用CLocalCalculagraph,
该类可以避免进程切换导致计时误差。
// 系统计时器
class CSystemCalculagraph
{
public:
void Start()
{
dwStart = GetTickCount();
}
void Stop()
{
dwEnd = GetTickCount();
}
DWORD GetElapsedTime()
{
return dwEnd - dwStart + 1; // 防止结果为零
}
private:
DWORD dwStart, dwEnd;
};
// 进程计时器
class CLocalCalculagraph
{
public:
void Start()
{
start = clock();
}
void Stop()
{
end = clock();
}
DWORD GetElapsedTime()
{
return end - start + 1; // 防止结果为零
}
private:
clock_t start, end;
};
示 例:
CRichEditCtrl *pRiched = &m_ctrlRichEd;
CLocalCalculagraph cc;
CFile f;
if (!f.Open("MinGWStudioFullSetupPlus-2.02.exe",CFile::modeRead)) return;
DWORD dwSize = f.GetLength();
LPBYTE pBuffer = new BYTE[dwSize + 1];
f.Read(pBuffer ,dwSize );
f.Close();
CString sFilterResult;
cc.Start();
StrFilter(pBuffer , 5, sFilterResult);
~~~~~~~~~ 这个函数是需要实现的,该格式仅为示例!
pRiched->SetWindowText(sFilterResult);
cc.Stop();
delete pBuffer ;
// 以下是用于评测的结果
printf("Used time:%lu\n", cc.GetElapsedTime());
测试数据:
二进制文件: MinGWStudioFullSetupPlus-2.02.exe 62073445 字节, Nov__7__2003
下载位置:202.118.239.46/Incoming/Other/BTC/tools/
最小长度 : 5
其它说明:
计时从字符串过滤开始,到结果输出为止,不包括文件读取时间,也不包括向
***** *******
RichEditCtrl控件输出时间。
请同学们综合考虑各方面因素,开拓思路,一试身手。
--
I came, I saw, I conquered ! — Caesar
※ 修改:·SwordLea 于 Jul 21 09:08:43 修改本文·[FROM: 202.118.246.241]
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.246.241]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.219毫秒