memorystream转换为十六进制字符串,并反向转换成memorystream(100分)

  • 主题发起人 主题发起人 adamc
  • 开始时间 开始时间
A

adamc

Unregistered / Unconfirmed
GUEST, unregistred user!
现有memorystream类型数据,想转换为十六进制字符串写入文本文件,并能反向将此十六进制字符串再转换回memorystream数据,请高手们多多指教,刚入门菜鸟,最好提供详细可用源代码
 
function StreamDataToStr(Stream: TMemoryStream): string;
var
i, z: int64;
d: Pointer;
begin
Result:='';
if Stream=nil then Exit;
z:=Stream.Size;
d:=Stream.Memory;
i:=0;
while i < z do
begin
Result:=Result+Format('%.2X', [Byte(Pointer(Longint(d) + i)^)]);
Inc(i);
end;
end;

function StrToStreamData(StrData: string; Stream: TMemoryStream): Boolean;
var
E: Integer;
i, z: int64;
d: Pointer;
begin
Result:=False;
if (StrData='') or (Stream=nil) then Exit;
Stream.Clear;
z:=Length(StrData) div 2;
Stream.SetSize(z);
d:=Stream.Memory;
i:=0;
while i <= z do
begin
Val('$'+Copy(StrData, i*2+1, 2), Byte(Pointer(Longint(d) + i)^), E);
Inc(i);
if E<>0 then Break;
end;
Result:=Stream.Size=z;
end;

稍改动一下可以每次用4个字节读写
 
procedure TForm1.Button1Click(Sender: TObject); //写文本
var
i: Integer;
t:Byte;
s: TMemoryStream;
l:tstringlist;
m:string;
begin
if not OpenDialog1.Execute then exit;
s := TMemoryStream.Create;
l:=tstringlist.Create ;
s.LoadFromFile(OpenDialog1.FileName);
s.Seek($0, soFromBeginning);
for i := 0 to s.Size-1 do
begin
s.Read(t, 1);
l.Add (IntToHex(t,2));
end;
s.Free;
l.SaveToFile('d:/1.txt');
l.Free ;
end;

function HextoOct(k: string): integer; //16进制转换为10进制
begin
result := StrtoInt('$' + k);
end;

procedure TForm1.Button2Click(Sender: TObject); //把文本还原
var
i: Integer;
t:Byte;
s: TMemoryStream;
l:tstringlist;
m:integer;
begin
if not OpenDialog1.Execute then exit;
s := TMemoryStream.Create;
l:=tstringlist.Create ;
l.LoadFromFile(OpenDialog1.FileName);
s.Seek($0, soFromBeginning);
for i := 0 to l.Count-1 do
begin
m:=HextoOct(l);
s.Write(m,1);
end;
l.Free;
s.SaveToFile('d:/1.rar');
s.Free ;
end;
 
感谢楼上两位的代码,但好像只把前半部分转换了,后半部分还没有转成功,都是乱码.
 
你可能没有试我写的两个函数,我测试成功了的。
 
我都试了,结果一样,都再转换后的字符串后加入乱码
 
能不能把你的代码贴出来看一下
 
procedure TMyfrm.Button1Click(Sender: TObject);
var
s:string;
tempstream: TMemoryStream
begin
s:='SealString:' + MemoryStreamToString(TBlobField(Query_seal.FieldByName('seal')).LoadFromStream(tempstream)); //tempstream为图片的流信息
end;

function MemoryStreamToString(BinStream:TMemoryStream): string;
var
i, z: int64;
d: Pointer;
begin
Result:='';
if BinStream=nil then Exit;
BinStream.Seek(0, soFromBeginning);
i:=0;
z:=BinStream.Size;
d:=BinStream.Memory;
while i < z do
begin
Result:=Result + Format('%.2X', [Byte(Pointer(Longint(d) + i)^)]); //Result后半部分为乱码
Inc(i);
end;
end;
 
procedure TMyfrm.Button1Click(Sender: TObject);
var
s:string;
tempstream: TMemoryStream
begin
s:='SealString:' + MemoryStreamToString(tempstream);
TBlobField(Query_seal.FieldByName('seal')).LoadFromStream(tempstream));
end;

这样试过没有?
 
这样肯定不行,因为tempstream还没初值,我怀疑 tempstream里边是否有不能转换的数据导致,或者tempstream.size长度太大
 
你当然要先将数据读入到tempstream中
可以用tempstream.LoadFromFile(文件名);
如果tempstream中无数据
执行TBlobField(Query_seal.FieldByName('seal')).LoadFromStream(tempstream));后
seal字段中肯定没有你想要的东西
 
所以你完整的代码应该是
procedure TMyfrm.Button1Click(Sender: TObject);
var
s:string;
tempstream: TMemoryStream
begin
tempstream:=TMemoryStream.Create;
try
tempstream.LoadFromFile(你的图片文件名);
s:='SealString:' + MemoryStreamToString(tempstream);
//s中是字符了,你可以保存在数据库表中的text类型字段中;
Query_seal.edit;//编辑一条记录,也许你要插入
TBlobField(Query_seal.FieldByName('seal')).LoadFromStream(tempstream));
Query_seal.post;
finally
tempstream.Free;
end;
end;
 
对不起,我把代码拷错了,应该是
TBlobField(Query_seal.FieldByName('seal')).SaveToStream(tempstream);
s:='SealString:' + MemoryStreamToString(tempstream);

我的实际功能为,专门有个程序负责处理图片,并存入数据库,代码如下:
tempstream:=TMemoryStream.Create;
Image2.Picture.Bitmap.SaveToStream(tempstream);

Query_seal.Edit;
TBlobField(Query_seal.FieldByName('seal')).LoadFromStream(tempstream);
Query_seal.Post;


另一个程序从数据库中取出图片信息做一些数据变换处理,以便后续功能的使用,代码如下:
TBlobField(Query_seal.FieldByName('seal')).SaveToStream(tempstream);
s:='SealString:' + MemoryStreamToString(tempstream);
但转换后后半部分是乱码.
 
跟踪发现,当i〉2047时,字符串末尾会自动加乱码,预先使用setlength()也不行,如何解决?
 
多人接受答案了。
 

Similar threads

回复
0
查看
891
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
927
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部