给你一个将记录体转换成十六进制字符串写到文件中保存的例子,转换后记录体的内容已经变成0,1,2,3..A,B,C,D,E,F十六进制表示的字符串了,如果需要,你还可以对这个串时行加密解密。
TStsSend是任何有固定长度的记录体,像整数、实数都没问题,关键要记住不能出现
var1 : String; 的定义,而必须定义成指定长度,比如
var1 : String[1000]; 否则会因为SIZEOF取不到正确的记录体长度而失败。
Function EnCode(tpSend:TSysSend):String;
var SentStream:TMemoryStream;
TmpComm
char;
Tmp:String;
begin
Result := '';
SentStream:=Tmemorystream.Create;
try
TmpLen:=sizeof(tpSend);
SentStream.Write(Tmplen,sizeof(integer)); //将记录体的长度写入流变量,用作解密时校对,可以省略,但解密时也要作相应更改。
Sentstream.Write(tpSend,Tmplen); //将变体写入流变量
Sentstream.Seek(0,0);
SetLength(tmp,SentStream.Size * 2);
BinToHex(PChar(Integer(SentStream.Memory)), PChar(Tmp),SentStream.Size); //将二进制内存流变成十六进制字符串
Result := Trim(tmp);
finally
sentStream.Free;
end;
end;
Procedure DeCodeParam(RecStrs:String; Var sbSys:TSysSend);
var
TmpRcvd:String;
Rcvd:TMemoryStream;
tmpLen:integer;
begin
TmpRcvd:=RecStrs;
rcvd:=tmemorystream.Create;
try
Rcvd.SetSize(Length(tmpRcvd) div 2);
HexToBin(PChar(TmpRcvd),PChar(Integer(Rcvd.Memory)),Length(tmpRcvd) div 2);
rcvd.Read(tmplen,sizeof(integer));
if Tmplen<>sizeof(sbSys) then
begin
ShowMessage('Error');
Abort;
end;
rcvd.Read(sbSys,Tmplen);
finally
Rcvd.Free;
end;
end;