Delphi 用哈夫曼算法解压压缩字符串

Delphi 用哈夫曼算法解压压缩字符串,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
函数解压缩(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;