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的輸出成爲字符串?
爲什麼你壓縮每一行(創建一個THuffman,壓縮和釋放)?這聽起來像是可能的原因,即結果流實際上是串聯在一起的一系列流,所以當你解壓縮時,你不知道每個壓縮行開始和結束的位置。 – 2010-11-26 08:45:12
@John,我同意這是正確的答案。向下移動評論。 – 2010-11-26 10:55:49