给你粘一个以前写测试的文件转十六进制,又还原回来的例子吧,也是用hextobin和bintohex两函数的:
procedure TForm1.Button1Click(Sender: TObject);
const BufSize=1024;
var FStrem:TFileStream;
filename:string;
Buf,Buf2:pchar;
//str:string;
ReadSize:Integer;
begin
if OpenDialog1.Execute then
begin
Memo1.Clear;
filename:=OpenDialog1.FileName;
FStrem:=TFileStream.Create(filename,fmOpenRead);
Memo1.Lines.BeginUpdate;
try
FStrem.Position:=0;
ProgressBar1.Max:=FStrem.Size;
while FStrem.Position<FStrem.Size do
begin
application.ProcessMessages;
if BufSize<=(FStrem.Size-FStrem.Position) then
ReadSize:=BufSize
else ReadSize:=FStrem.Size-FStrem.Position;
getmem(Buf,ReadSize+1);
fillchar(Buf^,ReadSize+1,0);
getmem(Buf2,ReadSize*2+1);//因为一个字节用两个十六进制表示,所以乘2
fillchar(Buf2^,ReadSize*2+1,0);
FStrem.Read(Buf^,ReadSize);
ProgressBar1.Position:=FStrem.Position;
BinToHex(Buf,Buf2,ReadSize);
if Memo1.text='' then//把结果赋给memo1,不过文件大的时候内容很多,memo1刷新很慢,程序也会变得很慢
Memo1.text:=Buf2
else Memo1.text:=Memo1.text+Buf2;
freeMem(Buf);
freeMem(Buf2);
end;
finally
FStrem.Free;
ProgressBar1.Position:=0;
Memo1.Lines.EndUpdate;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
const BufSize=1024;
var FileName:string;
FStream:TFileStream;
str,SubStr:String;
strLen:integer;
Buf:Pchar;
begin
if SaveDialog1.Execute then
begin
FileName:=SaveDialog1.FileName;
str:=self.Memo1.Text;//LowerCase
FStream:=TFileStream.Create(FileName,fmCreate); // or fmOpenWrite
try
repeat
application.ProcessMessages;
if length(str)>BufSize then
strLen:=BufSize
else strLen:=Length(str);
SubStr:=copy(str,1,strLen);
delete(str,1,strLen);
GetMem(Buf,(StrLen div 2)+1);//因为两个十六进制转成一个字节,所以要除2
try
Fillchar(buf^,(StrLen div 2)+1,0);
HexToBin(pchar(SubStr),Buf,(StrLen div 2));
FStream.Write(Buf^,(StrLen div 2));
finally
FreeMem(Buf);
end;
until str='';
finally
FStream.Free;
end;
end;
end;