当前位置: 首页 > 知识库问答 >
问题:

Delphi XE和ZLib问题

姜飞飙
2023-03-14

我在Delphi XE和我有一些问题与ZLib例程...

我正在尝试压缩一些字符串(并对其进行编码,以便通过SOAP webservice发送它--这并不重要--)

该字符串来自ZDecompressString中使用的不同的ZcompressString。

uses ZLib;
// compressing string
// ZCompressString('1234567890', zcMax); 
// compressed string ='xÚ3426153·°4'

// Uncompressing the result of ZCompressString, don't return the same:
// ZDecompressString('xÚ3426153·°4'); 
// uncompressed string = '123456789'

if '1234567890' <> ZDecompressString(ZCompressString('1234567890', zcMax)) then
  ShowMessage('Compression/Decompression fails');
Uses ZLib;
// compressing string
// ZCompressString('12345678901234567890', zcMax) 
// compressed string ='xÚ3426153·°40„³'

// Uncompressing the result of ZCompressString, don't return the same:
// ZDecompressString('xÚ3426153·°40„³') 
// uncompressed string = '12345678901'

if '12345678901234567890' <> ZDecompressString(ZCompressString('12345678901234567890', zcMax)) then
  ShowMessage('Compression/Decompression fails');
function TForm1.ZCompressString(aText: string; aCompressionLevel: TZCompressionLevel): string;
var
  strInput,
  strOutput: TStringStream;
  Zipper: TZCompressionStream;
begin
  Result:= '';
  strInput:= TStringStream.Create(aText);
  strOutput:= TStringStream.Create;
  try
    Zipper:= TZCompressionStream.Create(strOutput, aCompressionLevel);
    try
      Zipper.CopyFrom(strInput, strInput.Size);
    finally
      Zipper.Free;
    end;
    Result:= strOutput.DataString;
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

function TForm1.ZDecompressString(aText: string): string;
var
  strInput,
  strOutput: TStringStream;
  Unzipper: TZDecompressionStream;
begin
  Result:= '';
  strInput:= TStringStream.Create(aText);
  strOutput:= TStringStream.Create;
  try
    Unzipper:= TZDecompressionStream.Create(strInput);
    try
      strOutput.CopyFrom(Unzipper, Unzipper.Size);
    finally
      Unzipper.Free;
    end;
    Result:= strOutput.DataString;
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

其他人也有同样的问题??

共有1个答案

司空祯
2023-03-14

ZLib和我所知道的所有压缩代码一样,是一种二进制压缩算法。它对字符串编码一无所知。您需要为它提供要压缩的字节流。当您解压缩时,您将返回字节流。

但是您使用的是字符串,因此需要在编码文本和字节流之间进行转换。TStringStream类正在代码中完成这项工作。在创建字符串流实例时,为其提供文本编码。

只有您的代码不提供编码。因此使用默认的本地ANSI编码。这是第一个问题。这不是完整的Unicode编码。一旦使用本地ANSI代码以外的字符,链就会崩溃。

 类似资料:
  • import "compress/zlib" zlib包实现了对zlib格式压缩数据的读写,参见RFC 1950。 本包的实现提供了在读取时解压和写入时压缩的滤镜。例如,将压缩数据写入一个bytes.Buffer: var b bytes.Buffer w := zlib.NewWriter(&b) w.Write([]byte("hello, world\n")) w.Close() 然后将数

  • zlib 软件包包含 zlib 库,很多程序中的压缩或者解压缩函数都会用到这个库。zlib 适用于数据压缩的函式库,几乎适用于任何计算器硬件和操作系统。 特性: 数据头(header) zlib 能使用一个 gzip 数据头、zlib 数据头或者不使用数据头压缩数据。 通常情况下,数据压缩使用 zlib 数据头,因为这提供错误数据检测。当数据不使用数据头写入时,结果是没有任何错误检测的原始 DEF

  • 本节讲解 Linux 在搭建 LAMP 环境过程中对 zlib 和 libpng 源码包的安装。 安装zlib源码包 zlib 是提供数据压缩用的函数库,使用 DEFLATE 算法,最初是为 libpng 函数库所写的,后来普遍被许多软件所使用。此函数库为自由软件,使用 zlib 授权。 安装步骤如下: [root@localhost ~]# cd /usr/local/src/zlib-1.2.

  • 处理内存中的数据 # zlib_memory.py import zlib import binascii original_data = b'This is the original text.' print('Original :', len(original_data), original_data) compressed = zlib.compress(original_dat

  • zlib-ng 是 zlib 的改进版,主要目的是提升性能。

  • Stability: 2 - Stable zlib 模块提供通过 Gzip 和 Deflate/Inflate 实现的压缩功能,可以通过这样使用它 const zlib = require('zlib'); 压缩或者解压数据流(例如一个文件)通过zlib流将源数据流传输到目标流中来完成。 const gzip = zlib.createGzip(); const fs = require('f