问个关于在16进制文件内部查找的问题! 用 getline 读取 行,然后用 string::find 方法查找 ...... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <fstream>#include <string>#include <cstdlib>#include <iostream>using namespace std;int main(){ ifstream openf("test.txt"); if(openf.fail())cerr << "error in openning file!"<<endl; else { int lineindex=0; string line, str="6B 20 45 "; while(!openf.eof()) { string::size_type index; getline(openf, line); lineindex++; index=line.find(str, 0); if(index != string::npos) { cout<<"Find "<<str<<"on line="<<lineindex<<", index="<<index<<endl; break; } } } system("pause"); return 0; }/*test.txt 文件内容为:00000000h: 47 40 10 1C 00 41 F0 6F 03 E8 C1 00 00 F0 62 4A00000010h: 07 00 02 03 15 00 00 04 40 0A D6 D0 D1 EB B5 E700000020h: CA D3 CC A8 5B 4B 65 6E 67 10 4C 6F 63 61 6C 4E00000030h: 65 74 77 6F 72 6B 20 45 55 51 61 66 72 10 4C 6F00000040h: 63 61 6C 4E 65 74 77 6F 72 6B 20 45 4E 43 63 6800000050h: 69 0A D6 D0 D1 EB B5 E7 CA D3 CC A8 62 65 6C 1100000060h: 4C 6F 63 61 6C 4E 65 74 77 6F 72 6B 20 20 45 4E00000070h: 4A F0 00 E8 F7 77 9E FF FF FF FF FF FF FF FF FF?????00000080h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF程序输出 4行26列, 正确*/ 按字节找,先找到 6b 然后 看看后面是不是 20 如果不是则继续找 6b 如果是则看看后面是不是45 如果不是则继续找 6b 如果是则找到了,然后确定 6b 所在行的首地址,然后加上偏移量就是 6b 20 45 的内存地址了 to :jixingzhong(瞌睡虫·星辰)你这么做恐怕是不行的,因为 6b 20 45 是有可能位于2行的。 //KMP模式匹配按字节找记录匹配个数pc直到全匹配 楼上的代码感觉不是很好,直接查找"6B 20 45"很不方便,如果换一个字符串查找那又得先用计算器算出来然后再去修改代码去查找个人认为应该这样做:将要查找的字符串转换成十六进制的BYTE*,然后再将BYTE*的十六制值转换成相应的16进制字符串,也就是"6B 20 45",然后再Find就好了转换函数请到http://www.vckbase.com/document/viewdoc/?id=1133下载源码,找到String2Bytes(const char *pSrc, unsigned char *pDst, int nSrcLength),Bytes2String(const unsigned char *pSrc, char *pDst, int nSrcLength)即可实现互转 以二进制方式打开文件。读入数据。for(i=0; i < length - 2; i++){ if byte[i] == 0x6B { if(byte[i+1] == 0x20) if(byte[i+2] == 0x45) return pos; esle continue;elsecontinue; } byte 好象是JAVA里面的把 -_-! BYTE *p=new unsigned char[len] 弄成这个形式了 vc 图片随鼠标移动而移动 简单问题,在线立答立给 今天,我做了一件伟大的事,好开心啦!!! 请问vc++里如何进行单步执行? 如何在基于对话框的程序中,用文件存储信息?80分 我被甩了,今天我请客。 咋吧基于对话框的程序的主界面图标的背景改成透明 vs2010单文档工程在电脑桌面输出图像 如何截获鼠标拖动调整CListCtrl的列宽的消息 哪位用IME处理过中文输入法的问题?高高分啊... 求助:我有一个 CHECK1 控件,我怎么使其选中,还是不选中?谢谢! 如何获得工作组图标?
#include <string>
#include <cstdlib>
#include <iostream>using namespace std;int main()
{
ifstream openf("test.txt");
if(openf.fail())cerr << "error in openning file!"<<endl;
else
{
int lineindex=0;
string line, str="6B 20 45 ";
while(!openf.eof())
{
string::size_type index;
getline(openf, line);
lineindex++;
index=line.find(str, 0);
if(index != string::npos)
{
cout<<"Find "<<str<<"on line="<<lineindex<<", index="<<index<<endl;
break;
}
}
}
system("pause");
return 0;
}
/*
test.txt 文件内容为:
00000000h: 47 40 10 1C 00 41 F0 6F 03 E8 C1 00 00 F0 62 4A
00000010h: 07 00 02 03 15 00 00 04 40 0A D6 D0 D1 EB B5 E7
00000020h: CA D3 CC A8 5B 4B 65 6E 67 10 4C 6F 63 61 6C 4E
00000030h: 65 74 77 6F 72 6B 20 45 55 51 61 66 72 10 4C 6F
00000040h: 63 61 6C 4E 65 74 77 6F 72 6B 20 45 4E 43 63 68
00000050h: 69 0A D6 D0 D1 EB B5 E7 CA D3 CC A8 62 65 6C 11
00000060h: 4C 6F 63 61 6C 4E 65 74 77 6F 72 6B 20 20 45 4E
00000070h: 4A F0 00 E8 F7 77 9E FF FF FF FF FF FF FF FF FF?????
00000080h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF程序输出 4行26列, 正确
*/
45 如果不是则继续找 6b 如果是则找到了,然后确定 6b 所在行的首地址,然后加上偏移量就是 6b 20 45 的内存地址了
按字节找
记录匹配个数pc
直到全匹配
个人认为应该这样做:将要查找的字符串转换成十六进制的BYTE*,然后再将BYTE*的十六制值转换成相应的16进制字符串,也就是"6B 20 45",然后再Find就好了
转换函数请到http://www.vckbase.com/document/viewdoc/?id=1133下载源码,找到String2Bytes(const char *pSrc, unsigned char *pDst, int nSrcLength),
Bytes2String(const unsigned char *pSrc, char *pDst, int nSrcLength)即可实现互转
for(i=0; i < length - 2; i++)
{
if byte[i] == 0x6B
{
if(byte[i+1] == 0x20)
if(byte[i+2] == 0x45)
return pos;
esle
continue;
else
continue;
}