Delphi 用哈夫曼算法解压压缩字符串
我试图使用哈夫曼算法从 该装置有两个功能: 函数压缩(ASource:TMemoryStream):TMemoryStreamDelphi 用哈夫曼算法解压压缩字符串,delphi,huffman-code,Delphi,Huffman Code,我试图使用哈夫曼算法从 该装置有两个功能: 函数压缩(ASource:TMemoryStream):TMemoryStream 函数解压缩(ASource:TMemoryStream):TMemoryStream 我已经成功地将一个文件中的每一行压缩到另一个文件中 function StreamToString(const stream: TStream) : string; var Size: Integer; begin result:=''; Size := Stream.Size
函数解压缩(ASource:TMemoryStream):TMemoryStream 我已经成功地将一个文件中的每一行压缩到另一个文件中
function StreamToString(const stream: TStream) : string;
var
Size: Integer;
begin
result:='';
Size := Stream.Size - Stream.Position;
SetString(result, nil, Size);
Stream.Read(Pointer(result)^, Size);
end;
procedure TMaster.Button1Click(Sender: TObject);
var
list,list_:TStringlist;
AStream:TMemoryStream;
BStream:TMemoryStream;
s:string;
i,j:integer;
begin
list := TStringList.Create;
list_:= TStringList.Create;
list.LoadFromFile('d:\input.txt');
for j := 0 to List.Count - 1 do
begin
s:=list[j];
if (Length(s) = 0) then exit;
{i:=Pos(#13#10,s);
while (i > 0) do
begin
Delete(s,i,2);
i:=Pos(#13#10,s);
end;}
AStream:=TMemoryStream.Create;
with AStream do WriteBuffer(s[1],Length(s));
with THuffman.Create do
try
BStream:=Compress(AStream);
finally
Free;
AStream.Free;
end;
with THuffman.Create do
try
AStream:=ProcessToDecrypt (BStream);
list_.Add(StreamToString(BStream));
finally
BStream.Free;
end
end; //for j := 0 to List.Count - 1 do
list_.SaveToFile('d:\output.txt');
list_.free;
list.free;
end;
function THuffman.ProcessToDecrypt(ASource:TMemoryStream):TMemoryStream;
var ASize:Integer;
begin
ASize:=ReBuildTree(ASource);
exit;
end;
我还想将每个压缩行从文件解压缩到字符串
下面是我解压字符串的步骤
procedure TMaster.Button2Click(Sender: TObject);
var i:Integer;
AText:String;
AStream:TMemoryStream;
BStream:TMemoryStream;
begin
AText:='È1ëz-';
BStream:=TMemoryStream.Create;
with BStream do WriteBuffer(AText[1],Length(AText));
with THuffman.Create do
try
AStream:=ProcessToDecrypt (BStream);
AStream:=Decompress(BStream);
memoOut.Lines.add.StreamToString(BStream);
finally
BStream.Free;
end;
end;
按钮2单击过程不起作用。简短的问题是如何解压缩压缩的字符串
DeCompress的参数是TMemoryStream,如何使用字符串作为参数?如何将解压输出为字符串?除了我上面的注释之外,只要看看您的代码,AText中的值可能不是压缩字符串的正确表示形式。以下非常简单的程序(基于您的)有效:
为什么要单独压缩每一行(创建一个THuffman,压缩和释放)?这听起来像是可能的原因,即结果流实际上是一系列串连在一起的流,因此当您解压缩时,您不知道每个压缩行的开始和结束位置。@John,我同意这是正确的答案。把评论往下移。@John,首先,对不起我的英语不好。实际上,我想创建一个包含压缩字符串的数据库。接下来,我的程序将把每一行加载到一个数组中。Button2Click并不代表对每个压缩行进行解压缩。我的问题是如何解压压缩字符串?我想重新排列我的问题。DeCompress的参数是TMemoryStream,如何使用字符串作为参数?(我假设是unicode Delphi之前的版本,因为在D2009+中,这段代码会出错)当前将字符串复制到内存流中的方式看起来不错。还有一个TStringStream IIRC,但我从未使用过。我不是这个意思。假设我有加密的字符串。我只想将加密的字符串解密为字符串。它无法通过字符串工作,因为压缩字符串包含null(字符0)。基本上,字符串不能表示所有可能的字符数组。[很抱歉我之前混淆了压缩/解压缩和加密/解密]哇,这对我来说真是个坏消息:(为什么你需要传递压缩(二进制)文件)以字符串形式存储数据?您之前提到过使用数据库。我假设您正在尝试将压缩文本存储在varchar或类似文件中。您的数据库是否支持BLOB?如果支持,这将是存储二进制数据的更合适的方法。这是纯文本数据库。例如,我的数据是“aaaaa”、“bbbbb”等。每个数据(=字符串)由行分隔。我的程序将把纯文本中的所有行加载到一个数组中。这就是为什么我需要压缩每行字符串。因此,我的数据库大小更小,程序消耗的内存更少。
uses Huffman;
procedure TForm1.UncompressButtonClick(Sender: TObject);
var
AStream:TMemoryStream;
BStream:TMemoryStream;
begin
BStream:=TMemoryStream.Create;
with BStream do LoadFromFile('c:\temp\in.txt');
with THuffman.Create do
try
AStream:=Decompress(BStream);
AStream.SaveToFile('c:\temp\out.txt');
finally
BStream.Free;
end;
end;
procedure TForm1.CompressButtonClick(Sender: TObject);
var
AText:String;
AStream:TMemoryStream;
BStream:TMemoryStream;
begin
AText := Edit1.Text;
BStream:=TMemoryStream.Create;
with BStream do WriteBuffer(AText[1],Length(AText));
with THuffman.Create do
try
AStream:=Compress(BStream);
AStream.SaveToFile('c:\temp\in.txt');
finally
BStream.Free;
end;
end;