(学)Lazarus 字符串压缩、解压缩

针对客户反馈WinCE终端程序运行缓慢的问题,通过使用Lazarus和lNet组件进行多线程服务器开发,并实现数据压缩传输,有效提升了程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

     1、原有C#开发的WinCE系统+WebService;

     2、客户说WinCE上的终端程序运行速度慢,我也说慢;

     3、希望改造一个WinCE上的终端程序,因为熟悉Delphi所以Lazarus;

     4、Lazarus导入的WebService代理,我看不明白,还涉及到数据类型转换神马的,决定放弃WebService;

     5、打算采用lNet写个服务器,接收数据来处理和数据库之间的交互。

----------------------------------------我是分割线-----------------------------------------

解决思路:

     1、Lazarus 安装 lNet组件;(这个不难)

     2、把lNet中 那个Tcp示例改成多线程的;(这个也不难)

     3、但数据传输过程中效率如何解决?对压缩一下!如何压缩?

          a、官网上检索, http://www.lazarus.freepascal.org/index.php?topic=11552.0 ;

          b、但这里面用到了 Indy组件,而这个组件点名说了,我暂时不支持WinCE;

          c、找个方法把  Indy组件功能替换掉 http://topic.csdn.net/t/20041012/10/3446989.html ;

    4、成功了。

 

代码如下:

         function TFormMain.GzBase64(const s: string): string;
var OutStream, InpStream, GzStream, b64Stream: TStream;
begin
   OutStream := TStringStream.Create('');
   try
      b64Stream := TBase64EncodingStream.Create(OutStream);
      try
         GzStream := Tcompressionstream.create(clmax,b64Stream);
         try
            InpStream := TStringStream.Create(s);
            try
               // Copy input stream
               GzStream.CopyFrom(InpStream,InpStream.Size);
            finally
               InpStream.Free;
            end;
         finally
            GzStream.Free;
         end;
      finally
         b64Stream.Free;
      end;
      result := TStringStream(OutStream).DataString;
   finally
      OutStream.Free;
   end;
end;
function TFormMain.unGzBase64(const s: string): string;
var OutStream,deCompressStream: TStream;
     SL:TStringList;

begin
if(s='')
then
begin
Result:='';
abort;
end;

 SL := TStringList.Create;
 OutStream := TStringStream.Create(Base64ToString(s));
 DecompressStream := TDecompressionStream.Create(OutStream);

 try
  SL.LoadFromStream(DecompressStream);
  Result:=SL.Text;
  finally
    DecompressStream.Free;
    OutStream.Free;
    SL.Free;
  end;
end;


function   TFormMain.Base64ToString(const   Value:   string):   string;
var
    x,   y,   n,   l:   Integer;
    d:   array[0..3]   of   Byte;
    Table   :   string;
begin
    Table   :=
        #$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$3E   +#$40
        +#$40   +#$40   +#$3F   +#$34   +#$35   +#$36   +#$37   +#$38   +#$39   +#$3A   +#$3B   +#$3C
        +#$3D   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40   +#$00   +#$01   +#$02   +#$03
        +#$04   +#$05   +#$06   +#$07   +#$08   +#$09   +#$0A   +#$0B   +#$0C   +#$0D   +#$0E   +#$0F
        +#$10   +#$11   +#$12   +#$13   +#$14   +#$15   +#$16   +#$17   +#$18   +#$19   +#$40   +#$40
        +#$40   +#$40   +#$40   +#$40   +#$1A   +#$1B   +#$1C   +#$1D   +#$1E   +#$1F   +#$20   +#$21
        +#$22   +#$23   +#$24   +#$25   +#$26   +#$27   +#$28   +#$29   +#$2A   +#$2B   +#$2C   +#$2D
        +#$2E   +#$2F   +#$30   +#$31   +#$32   +#$33   +#$40   +#$40   +#$40   +#$40   +#$40   +#$40;

    SetLength(Result,   Length(Value));
    x   :=   1;
    l   :=   1;
    while   x   <   Length(Value)   do
    begin
        for   n   :=   0   to   3   do
        begin
            if   x   >   Length(Value)   then
                d[n]   :=   64
            else
            begin
                y   :=   Ord(Value[x]);
                if   (y   <   33)   or   (y   >   127)   then
                    d[n]   :=   64
                else
                    d[n]   :=   Ord(Table[y   -   32]);
            end;
            Inc(x);
        end;
        Result[l]   :=   Char((D[0]   and   $3F)   shl   2   +   (D[1]   and   $30)   shr   4);
        Inc(l);
        if   d[2]   <>   64   then
        begin
            Result[l]   :=   Char((D[1]   and   $0F)   shl   4   +   (D[2]   and   $3C)   shr   2);
            Inc(l);
            if   d[3]   <>   64   then
            begin
                Result[l]   :=   Char((D[2]   and   $03)   shl   6   +   (D[3]   and   $3F));
                Inc(l);
            end;
        end;
    end;
    Dec(l);
    SetLength(Result,   l);
end;

转载于:https://www.cnblogs.com/spymaster/archive/2011/01/25/1944604.html

### Lazarus 中 PostgreSQL 字符串长度限制及处理方法 在开发基于 Lazarus 和 PostgreSQL 的应用程序时,字符串字段的长度管理是一个重要方面。PostgreSQL 提供了多种数据类型来存储字符数据,每种类型的特性不同。 对于固定长度的字符串,可以使用 `CHAR(n)` 或者 `BPCHAR` 类型,在这种情况下,定义的最大长度 n 是固定的,并且会自动填充到指定宽度[^1]。然而,通常推荐使用可变长度的字符串类型如 `VARCHAR(n)` 来代替它;这里 n 表示最大允许的字符数,如果未提供则默认是没有上限的(即相当于 `TEXT` 类型)。当使用 `VARCHAR` 时,实际占用的空间只取决于所存入的数据量而不是预设的最大值[^2]。 为了确保数据库表结构设计合理并能有效支持应用逻辑需求,建议开发者依据业务规则设定合适的列属性。例如: - 如果知道某个特定字段永远不会超过一定数量的字符,则应为其设置一个合理的 `VARCHAR` 长度约束; - 对于那些可能包含任意大小文本内容的情况,可以选择不带参数的 `TEXT` 数据类型[^3]。 下面是一些关于如何通过 Lazarus 进行 SQL 查询操作的例子,这些例子展示了怎样创建具有适当字符串长度限制的表格以及插入符合预期格式的数据记录。 #### 创建带有 VARCHAR 列的表 ```sql CREATE TABLE example_table ( id SERIAL PRIMARY KEY, name VARCHAR(50), -- 名字最长可达50个字符 description TEXT -- 描述不限制长度 ); ``` #### 向上述表中插入新纪录 ```pascal procedure TForm1.InsertRecord; var Query: TSQLQuery; begin Query := TSQLQuery.Create(nil); try with Query do begin DatabaseName := 'YourDatabaseConnection'; SQL.Text := 'INSERT INTO example_table (name, description) VALUES (:NAME, :DESCRIPTION)'; ParamByName('NAME').AsString := EditName.Text; // 假定有一个编辑框用于输入名字 ParamByName('DESCRIPTION').AsString := MemoDescription.Lines.Text; // 使用多行文本控件获取描述信息 ExecSQL; end; finally FreeAndNil(Query); end; end; ``` 这段 Pascal 代码片段说明了如何利用组件库中的 `TSQLQuery` 组件执行含有参数化的 INSERT 语句向 PostgreSQL 数据库添加新的条目。注意这里的 `EditName.Text` 应该被验证不超过其对应的 `VARCHAR` 定义的最大长度以防止潜在错误发生[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值