疯了:如何写16进制的文件?在线等待...(200分)

  • 主题发起人 主题发起人 darkor
  • 开始时间 开始时间
D

darkor

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将字符串的文档写成16进制的文件:
比如:E4FC12000E
如果写成文本文件ultraEdit的hex下看就是:45 34 46 43 31 32 30 30 30 45(能显示的字符都是ASCii码);
现在要求用ultraEdit打开文件后,在Hex下看就是:E4 FC 12 00 0E。
(不管存档成什么文件)
怎么办?DX救命啊,分不够再加。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
fs: TFileStream;
str:string;
begin
fs := TFileStream.Create('c:/1.dat', fmCreate);

str:=#$E4#$FC#$12#$00#$0E;
fs.WriteBuffer(str[1], length(str));
fs.Free;
end;

end.

 
简单提示一下:
1、StrToInt('$' + 'E4') 得到的是ASC码为$E4的Byte;
2、用流文件处理;
 
在HEX下是无法显示出十六进制以外的字符的啵?
 
字符串两位两位取,分别加'$'存到新文件中。
 
文件换格式我不会 但这有个字符串转成16进制的例子 你把文本里的东西读到Tstrings里转完再保存成文本吧
ss:='JHJKHH78798798jhjhjkhj**(*(*&';
sss:='';
if (length(ss) mod 4)<>0 then
begin
for i:=1 to (4-(length(ss) mod 4)) do
ss:='0'+ss;
end;
if ((length(ss) div 4) mod 2)<>0 then
ss:='0000'+ss;
for i:=0 to (length(ss) div 4) do
begin
IF copy(ss,i*4,4)='0000' then
sss:=sss+'0';
IF copy(ss,i*4,4)='0001' then
sss:=sss+'1';
IF copy(ss,i*4,4)='0010' then
sss:=sss+'2';
IF copy(ss,i*4,4)='0011' then
sss:=sss+'3';
IF copy(ss,i*4,4)='0100' then
sss:=sss+'4';
IF copy(ss,i*4,4)='0101' then
sss:=sss+'5';
IF copy(ss,i*4,4)='0110' then
sss:=sss+'6';
IF copy(ss,i*4,4)='0111' then
sss:=sss+'7';
IF copy(ss,i*4,4)='1000' then
sss:=sss+'8';
IF copy(ss,i*4,4)='1001' then
sss:=sss+'9';
IF copy(ss,i*4,4)='1010' then
sss:=sss+'A';
IF copy(ss,i*4,4)='1011' then
sss:=sss+'B';
IF copy(ss,i*4,4)='1100' then
sss:=sss+'C';
IF copy(ss,i*4,4)='1101' then
sss:=sss+'D';
IF copy(ss,i*4,4)='1110' then
sss:=sss+'E';
IF copy(ss,i*4,4)='1111' then
sss:=sss+'F';
end;
 
谢谢各位的解答!
hfghfghfg的解答是可行的,可是新的问题又出来了:(
我的数据是“E4FC12000E”这种联起来的。(存在edit中)
不知道怎么转换成:str:=#$E4#$FC#$12#$00#$0E;这种形式?
先在这里谢过了!
 
看下面的链接,问题是一样的
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2157435
 
把下面函数的结果保存到文件中OK 关键如果你的数据很长的话,最好做一下优化
Function CombinHexToBinArr(const StrA: String;): String;
Function HexToByte(ptr: PChar): BYTE;
begin
case pBt^ of
'0'..'9': Result:= Ord(ptr^)-Ord('0');
'a'..'f': Result:= Ord(ptr^)-Ord('a');
'A'..'F': Result:= Ord(ptr^)-Ord('A');
else
raise Exception.Create('Invalid Char');
end;
var
pSor: PBYTE;
pDest: PBYTE;
aInt: Integer;
begin
SetLength(Result, (Length(StrA) +1 ) div 2);
pSor:= PChar(StrA);
pDest:= PChar(Result);
if (Length(StrA) mod 2) = 1 then
begin
pDest^:= Char(HexToByte(pSor));
inc(pSor);
inc(pDest);
end;
for aInt:= Length(StrA) div 2 downto 0 do
begin
pDest^:=Char(HexToByte(pSor^)+HexToByte(pSor[1]));
inc(pDest);
inc(pSor,2);
end;
end;
 
已经解决了,谢谢各位!
procedure TForm1.Button4Click(Sender: TObject);
var
theFile : TextFile;
FileHandle: Integer;
fileName : String;
wtFileName : String;
buffer : String;
strLen : String;
strTmp : String;
i : integer;
nDate : Byte;
begin
fileName := 'C:/test/TRY.HEX';{为text文本}
wtFileName := 'C:/test.dat';
AssignFile(theFile,fileName);
FileHandle := FileCreate(wtFileName);
Reset(theFile);
try
while not Eof(theFile) do
begin
Readln(theFile,buffer);
i := 0;
while i<=Length(buffer) do
begin
strTmp := '$'+ buffer + buffer[i+1];
nDate := StrToInt(strTmp);
FileWrite(FileHandle,nDate,sizeof(nDate));
i := i + 2;
end;
end;
finally
CloseFile(theFile);
FileClose(FileHandle);
end;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部