在论坛中也没找到合适的答案,只好重问一下了。我要做的事:
1、打开一个16进制的文件,里面内容如:……E1 81 D9 DF……
2、从里面匹配到字符串,如:31 99 F3
3、定位该字符串的位置,找到其前后两个“E1”的位置
4、将这两个E1中的字符串拷贝出来,保存入新的txt文件中。好复杂啊,有没有高人指点一下,给出代码最好!
1、打开一个16进制的文件,里面内容如:……E1 81 D9 DF……
2、从里面匹配到字符串,如:31 99 F3
3、定位该字符串的位置,找到其前后两个“E1”的位置
4、将这两个E1中的字符串拷贝出来,保存入新的txt文件中。好复杂啊,有没有高人指点一下,给出代码最好!
解决方案 »
- VirtualProtect内存分配访问无效。
- 关于 WriteFile 有点难的问题?
- 这个文件[dsgnintf.pas]不知道大家能否还用的着?
- 如何让dos程序显示图片,难吗?delphi能编吗??
- 从Tpanel继承一个组件,其中用到的一个组件有onbuttonclick事件,我怎样在我的组件中发布这个事件
- 关于vcl的问题
- 有兴趣的话,可以进来看看哟!呵~~~~~~呵
- 用query对一个数据库进行查询后,怎么使查询后的结果处于编辑状态
- delphi5自带的interbase5.5数据库的安装序列号是多少?请各位帮忙!!!谢谢!
- 在看《windows 核心编程》一本书,里面的讲解是用vc++,可我不会,难道我非用学vc吗?你们是怎么看这本书的?
- 如何读取16进制文件
- 问个简单的问题 关于imagelist的问题
procedure TForm1.Button1Click(Sender: TObject);
var
iFile : Integer;
iSize : Integer;
sData : String;
sOut : String;
iPos : Integer;
iStart: Integer;
iEnd : Integer;
begin
iFile := FileOpen('F:\1.HEX', fmOpenRead);
if iFile <> -1 then
begin
iSize := FileSeek(iFile, 0, 2);
FileSeek(iFile, 0, 0);
SetLength(sData, iSize);
FileRead(iFile, SData[1], iSize);
FileClose(iFile);
sData := AnsiReplaceStr(sData, #13#10, ' ');
sOut := '';
iPos := 1;
repeat
iPos := PosEx('31 99 F3', sData, iPos);
if iPos <= 0 then break;
iStart := iPos - 1;
while iStart > 0 do
begin
if Copy(sData, iStart, 2) = '51' then break;
dec(iStart);
end;
iEnd := PosEx('51', sData, iPos);
if (iStart > 0) and (iEnd > 0) then sOut := sOut + Copy(sData, iStart, iEnd - iStart + 2) + #13#10;
inc(iPos);
until False;
iFile := FileCreate('F:\1.TXT');
if iFile <> -1 then
begin
FileWrite(iFile, sOut[1], Length(sOut));
FileClose(iFile);
end;
end;
end;
谢谢给的例程,基本理解了,可是PosEx('31 99 F3', sData, iPos);没能够把这个串定位到,是不是16进制的有什么讲究?定位的时候需要转换一下?
看了楼主最后一个回复,感觉楼主手头的文件又好象是二进制文件了,楼主最好确认一下。
UltraEdit里看到的格式:
00000000h: E1 81 D9 DF……;后面几个乱码
00000010h: 03 02 01 01……;
……
UltraEdit里看到的格式:
00000000h: E1 81 D9 DF……;后面几个乱码
00000010h: 03 02 01 01……;
……明显是个二进制文件。以上代码对它没用处,需要另外写一个了。
var
iFile : Integer;
iSize : Integer;
bData : array of Byte;
sOut : String;
iPos : Integer;
iStart: Integer;
iEnd : Integer;
iLoop : Integer;
begin
iFile := FileOpen('F:\1.HEX', fmOpenRead);
if iFile <> -1 then
begin
iSize := FileSeek(iFile, 0, 2);
FileSeek(iFile, 0, 0);
SetLength(bData, iSize);
FileRead(iFile, bData[0], iSize);
FileClose(iFile);
sOut := '';
iPos := 0;
repeat
while iPos <= iSize - 3 do
begin
if (bData[iPos] = $31) or (bData[iPos + 1] = $99) or (bData[iPos + 2] = $F3) then break;
inc(iPos);
end;
if iPos > iSize - 3 then break;
iStart := iPos - 1;
while iStart >= 0 do
begin
if bData[iStart] = $51 then break;
dec(iStart);
end;
iEnd := iPos + 3;
while iEnd < iSize do
begin
if bData[iEnd] = $51 then break;
inc(iEnd);
end;
if (iStart >= 0) and (iEnd < iSize) then
begin
for iLoop := iStart to iEnd do
sOut := sOut + IntToHex(bData[iLoop], 2) + ' ';
sOut := sOut + #13#10;
end;
inc(iPos);
until iPos > iSize - 3;
iFile := FileCreate('F:\1.TXT');
if iFile <> -1 then
begin
FileWrite(iFile, sOut[1], Length(sOut));
FileClose(iFile);
end;
end;
end;
就可以原封不动地拷贝过去了。但是还有一个问题,就是上面问过的:怎么能把字符串str='F3'以变量的形式赋给bData[iPos]?(赋值成:bData[iPos]=$F3)