線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2680
推到 Plurk!
推到 Facebook!

如何壓縮 String ??

答題得分者是:wameng
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-02 23:13:47 IP:211.78.xxx.xxx 未訂閱
var sstr : string; 假使 sstr := '...........';// 有 10k 以上的長度 sstr 存入資料庫的某一個欄位,很浪費空間 不知有無元件,可以將 sstr 的空間押小一點,再存入料庫 而且未來可以解壓,恢復原來的真正內容?? 謝謝您 !!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-03 00:48:36 IP:219.81.xxx.xxx 未訂閱
可用Delphi 內附的ZLib。 內容較大,建議使用 BLOB 欄位型態。 因為壓縮的內容,在有些資料庫上可能會產生亂碼。 另外使用 Tstream 方式讀寫,效率上也會比較高。 參考參考!
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-03 02:29:20 IP:211.78.xxx.xxx 未訂閱
引言: 可用Delphi 內附的ZLib。 內容較大,建議使用 BLOB 欄位型態。 因為壓縮的內容,在有些資料庫上可能會產生亂碼。 另外使用 Tstream 方式讀寫,效率上也會比較高。 參考參考!
Procedure ZlibCompress(instream,outStream:TStream);
var
  cps:TCompressionStream;
  begin
  inStream.Position:=0;
  cps := TCompressionStream.Create(clFastest,OutStream);
  try
    cps.CopyFrom(inStream,0);
  finally
    cps.Free;
  end;
end;
在以前的文章中,有找到 有關 ZLIB 的壓縮範例 問題是,假設我壓縮前是用 STRING 傳入,壓縮後也是要用 STRING 傳出 instream ==> EDIT1.TEXT outStream ==> EDIT2.TEXT Stream 與 String 如何轉換(我對 Stream 的觀念蠻生疏的) 還是我的思考方向錯誤,有其他做法?? 真的不解?? 謝謝您 發表人 - 小蚊子 於 2005/04/03 02:30:29
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-03 10:06:04 IP:219.81.xxx.xxx 未訂閱
以下是使用 String 方式,實現壓縮及解壓縮。
var
  S1,S2,S3 : Pointer; {S1 ->加密 -> S2 -> 解密 -> S3}
  Blen :integer;
  Zlen:integer;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Blen :=Length(Edit1.text);
  Label1.caption:=inttostr(Blen);      GetMEM(S1,Blen);
  Try
    StrCopy(S1,PChar(Edit1.text));
    GetMEM(S2,Blen);
    {不釋放 S2 }
    CompressBuf(S1,Blen,S2,zLen);
    Edit2.Text := PChar(S2);
  finally
    Freemem(S1);
  end;
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  GetMEM(S3,Blen);
  Try
    DeCompressBuf(S2,Zlen,Blen,S3,Blen);
    Edit3.Text := PChar(S3);
  finally
    FreeMem(S3);
    FreeMem(S2);
  end;
end;
參考一下!亂寫的。請自行改為函數化吧!
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-04 11:49:48 IP:218.163.xxx.xxx 未訂閱
引言: Stream 與 String 如何轉換(我對 Stream 的觀念蠻生疏的) 還是我的思考方向錯誤,有其他做法?? 真的不解?? 謝謝您
插花一下, 可以看看 TStringStrea Class.
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-04 11:50:36 IP:218.163.xxx.xxx 未訂閱
引言: Stream 與 String 如何轉換(我對 Stream 的觀念蠻生疏的) 還是我的思考方向錯誤,有其他做法?? 真的不解?? 謝謝您
插花一下, 可以看看 TStringStream Class.
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-04 13:26:45 IP:218.17.xxx.xxx 未訂閱
可以考虑用 TStringStream。    另外,TStream和String还可以这样互相转换:    
var
  S:string;
  Stream:TMemoryStream;
begin
  Stream:=TMemoryStream.Create;
  try
    Stream.LoadFromFile('xxxx.txt');
   SetLength(S,STream.Size);
   Stream.Position:=0;
   Stream.Read(S[1],Stream.Size); //这样把Stream里的内容放进S       Memo1.Lines.Add(S);
    S:='123456789';
    Stream.Position:=0; //先确定要从哪里开始放S
    Stream.Write(S[1],Length(S)); //这样把S的内容放进Stream
  finally
    Stream.Free;
  end;
end;
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-06 15:41:07 IP:218.103.xxx.xxx 未訂閱
我是路過的 有個問題 是 compressbuf 跟 DeCompressBuf help 裡面都找不到?? 請問在那裡
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-06 16:13:15 IP:61.222.xxx.xxx 未訂閱
引言: 我是路過的 有個問題 是 compressbuf 跟 DeCompressBuf help 裡面都找不到?? 請問在那裡
uses Zlib; 在Delphi 光碟中 Info\Extras\Zlib 有Zlib 程式碼
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-07 14:28:58 IP:218.103.xxx.xxx 未訂閱
引言:
引言: 我是路過的 有個問題 是 compressbuf 跟 DeCompressBuf help 裡面都找不到?? 請問在那裡
uses Zlib; 在Delphi 光碟中 Info\Extras\Zlib 有Zlib 程式碼
謝謝
系統時間:2024-05-02 17:17:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!