使用 zlib 压缩 Base64 字符串

elc*_*lie 2 delphi base64 zlib delphi-10.1-berlin

我需要通过 TCP 协议从 Windows 向移动设备、iOS 和 Android 发送一个大的 Base64 字符串。
我发送和接收没有问题,但是字符串大小太大,大约 24000 个字符,我正在寻找压缩和解压缩这些字符串的方法。
看起来,最好的方法是使用 Zlib,我发现这些链接Delphi XE 和 ZLib Problems (II)其中解释了如何做到这一点。
这些函数适用于普通文本字符串,但压缩 Base64 字符串会使它们变得更大。
我要发送的一个非常小的字符串的示例如下:



我需要帮助。
我使用的功能是这样的:

uses
  SysUtils, Classes, ZLib, EncdDecd;

function CompressAndEncodeString(const Str: string): string;
var
  Utf8Stream: TStringStream;
  Compressed: TMemoryStream;
  Base64Stream: TStringStream;
begin
  Utf8Stream := TStringStream.Create(Str, TEncoding.UTF8);
  try
    Compressed := TMemoryStream.Create;
    try
      ZCompressStream(Utf8Stream, Compressed);
      Compressed.Position := 0;
      Base64Stream := TStringStream.Create('', TEncoding.ASCII);
      try
        EncodeStream(Compressed, Base64Stream);
        Result := Base64Stream.DataString;
      finally
        Base64Stream.Free;
      end;
    finally
      Compressed.Free;
    end;
  finally
    Utf8Stream.Free;
  end;
end;

function DecodeAndDecompressString(const Str: string): string;
var
  Utf8Stream: TStringStream;
  Compressed: TMemoryStream;
  Base64Stream: TStringStream;
begin
  Base64Stream := TStringStream.Create(Str, TEncoding.ASCII);
  try
    Compressed := TMemoryStream.Create;
    try
      DecodeStream(Base64Stream, Compressed);
      Compressed.Position := 0;
      Utf8Stream := TStringStream.Create('', TEncoding.UTF8);
      try
        ZDecompressStream(Compressed, Utf8Stream);
        Result := Utf8Stream.DataString;
      finally
        Utf8Stream.Free;
      end;
    finally
      Compressed.Free;
    end;
  finally
    Base64Stream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

据我了解,您已完成以下问题:

  1. 将字符串编码为 UTF-8 字节。
  2. 使用 zlib 压缩这些字节。
  3. Base64 对压缩字节进行编码。

然后,您尝试压缩步骤 3 的输出,发现结果并不更小。这是可以预料的。您已经压缩了数据,进一步尝试压缩数据不会显着减小大小,尤其是如果您同时进行了 Base64 编码的话。如果您可以重复压缩数据并使其每次都变得更小,那么最终将什么都没有剩下。这显然是不可能的。

我认为你已经做得很好了。您可以转换为 UTF-8,对于大多数文本来说,UTF-8 是最节省空间的 Unicode 编码。如果您使用中文文本,那么最好使用 UTF-16。然后你压缩UTF-8,这也是合理的。最后为了传输你用base64编码,也是合理的。

减少要传输的数据大小的最明显方法是省略 base64 步骤。如果您可以传输步骤 2 中生成的压缩字节,那么您将传输更少的字节。Base64 使用 4 个字节来编码 3 个字节,因此 Base64 编码数据的大小比输入数据大三分之一。

另一种方法可能是使用比 zlib 更好的压缩算法,但同样也存在限制。通常,更好的压缩是以增加计算时间为代价的。