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)
据我了解,您已完成以下问题:
然后,您尝试压缩步骤 3 的输出,发现结果并不更小。这是可以预料的。您已经压缩了数据,进一步尝试压缩数据不会显着减小大小,尤其是如果您同时进行了 Base64 编码的话。如果您可以重复压缩数据并使其每次都变得更小,那么最终将什么都没有剩下。这显然是不可能的。
我认为你已经做得很好了。您可以转换为 UTF-8,对于大多数文本来说,UTF-8 是最节省空间的 Unicode 编码。如果您使用中文文本,那么最好使用 UTF-16。然后你压缩UTF-8,这也是合理的。最后为了传输你用base64编码,也是合理的。
减少要传输的数据大小的最明显方法是省略 base64 步骤。如果您可以传输步骤 2 中生成的压缩字节,那么您将传输更少的字节。Base64 使用 4 个字节来编码 3 个字节,因此 Base64 编码数据的大小比输入数据大三分之一。
另一种方法可能是使用比 zlib 更好的压缩算法,但同样也存在限制。通常,更好的压缩是以增加计算时间为代价的。
| 归档时间: |
|
| 查看次数: |
5914 次 |
| 最近记录: |