usoappacketcomuncompressor.pas

来自「Delphi开发webservice的一套例子」· PAS 代码 · 共 102 行

PAS
102
字号
unit uSoapPacketComUnCompressor;

interface

uses
  SysUtils, Classes;

function XTToCompressSoapPacket(const spPacket: string): string;
function XTToUnCompressSoapPacket(const spPacket: string): string;
function XTCompressedSize(const spPacket: string): Integer;

implementation

uses Zlib, EncdDecd;

function XTToCompressSoapPacket(const spPacket: string): string;
var
  msCompressed : TMemoryStream;
  zlibCompressor : TCompressionStream;
  ssData : TStringStream;
begin
  msCompressed := TMemoryStream.Create;
  ssData := TStringStream.create('');
  try
    zlibCompressor := TCompressionStream.Create(clDefault,
                           msCompressed);
    zlibCompressor.Write(spPacket[1], length(spPacket));
  finally
    FreeAndNil(zlibCompressor);
  end;
  try
    msCompressed.Position := 0;
    EncodeStream(msCompressed, ssData);
    Result := sSData.Datastring;
  finally
    FreeAndNil(msCompressed);
    FreeAndNil(ssData);
  end;
end;

function XTToUnCompressSoapPacket(const spPacket: string): string;
var
  msData : TMemoryStream;
  msEncoded : TMemoryStream;
  zlibUnCompressor : TDeCompressionStream;
  fBufLen : integer;
  fBuffer : array[0..16383] of byte;
begin
  msData := TMemoryStream.create;
  msEncoded := TMemoryStream.create;
  try
    msData.size := length(spPacket);
    move(spPacket[1], msData.memory^, msData.size);
    msData.position := 0;

    DecodeStream(msData, msEncoded);
    msData.size := 0;
    msEncoded.position := 0;
    zlibUnCompressor := TDeCompressionStream.create(msEncoded);
    try
      fBufLen := zlibUnCompressor.Read(fBuffer, SizeOf(fBuffer));
      while fBufLen > 0 do
      begin
        msData.Write(fBuffer, fBufLen);
        fBufLen := zlibUnCompressor.Read(fBuffer, SizeOf(fBuffer));
      end;
    finally
      FreeAndNil(zlibUnCompressor);
    end;
    msData.position := 0;
    SetLength(Result, msData.size);
    move(msData.memory^, Result[1], msData.size);
  finally
    FreeAndnil(msEncoded);
    FreeAndNil(msData);
  end;
end;

function XTCompressedSize(const spPacket: string): Integer;
var
  msCompressed : TMemoryStream;
  zlibCompressor : TCompressionStream;
begin
  msCompressed := TMemoryStream.Create;
  try
    zlibCompressor := TCompressionStream.Create(clDefault,
                           msCompressed);
    zlibCompressor.Write(spPacket[1], length(spPacket));
  finally
    FreeAndNil(zlibCompressor);
  end;
  try
    msCompressed.Position := 0;
    Result := msCompressed.Size;
  finally
    FreeAndNil(msCompressed);
  end;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?