2010-11-26 134 views
1

我想使用Huffman算法從http://www.explainth.at/downloads/huff.zip解壓壓縮串霍夫曼算法

有兩種功能的單元:

功能壓縮(ASource:內存流):內存流;
函數DeCompress(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; 

Button2Click程序不起作用。 簡短的問題是我如何解壓縮字符串

解壓的參數是內存流,如何使用一個字符串作爲參數?
如何使DeCompress的輸出成爲字符串?

+2

爲什麼你壓縮每一行(創建一個THuffman,壓縮和釋放)?這聽起來像是可能的原因,即結果流實際上是串聯在一起的一系列流,所以當你解壓縮時,你不知道每個壓縮行開始和結束的位置。 – 2010-11-26 08:45:12

+1

@John,我同意這是正確的答案。向下移動評論。 – 2010-11-26 10:55:49

回答

2

除了我上面的評論,只是看你的代碼,AText的值可能不是一個正確的壓縮字符串表示。下面非常簡單的程序(基於你的)的作品:

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;