在我的应用程序中,我构建了一个xml结构并将其发送给delphi客户端。在该XML我有一个压缩法,Base64编码字符串的标签:解压缩Delphi中的DeflateStream(C#)
public static string Zip(string text)
{
byte[] buffer = System.Text.Encoding.Unicode.GetBytes(text);
MemoryStream ms = new MemoryStream();
//using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true))
//{
// zip.Write(buffer, 0, buffer.Length);
//}
using (System.IO.Compression.DeflateStream zip = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}
我的德尔福客户端必须从标签获得的数据,并再次把它变成了即basestring。不幸的是,我得到一个
ezdecompressionerror数据错误
我尝试了一些网络提供的功能,例如:
function ZDecompressString(aText: string): string;
var
Utf8Stream: TStringStream;
Compressed: TMemoryStream;
Base64Stream: TStringStream;
begin
Base64Stream := TStringStream.Create(aText, TEncoding.ASCII);
try
Compressed := TMemoryStream.Create;
try
DecodeStream(Base64Stream, Compressed);
Compressed.Position := 0;
Utf8Stream := TStringStream.Create('', TEncoding.ANSI);
try
ZDecompressStream(Compressed, Utf8Stream);
Result := Utf8Stream.DataString;
finally
Utf8Stream.Free;
end;
finally
Compressed.Free;
end;
finally
Base64Stream.Free;
end;
end;
但没有在这里工作。我正在使用XE2和标准的Zlib库。我通过一些文章阅读,但我不能想办法的:
http://forum.codecall.net/topic/76077-compress-and-decompress-with-zlib-library/
http://www.yanniel.info/2011/01/string-compress-decompress-delphi-zlib.html
http://www.delphipraxis.net/89090-string-mit-gzip-ent-zippen.html
我也试过在C#中解压缩它,不应该吃惊的是它的工作。我想我的问题在于delphi解压缩代码的udnerstanding,或者我可能是一个真正的愚蠢的人。但不幸的是,我没有得到它,我可以如何使这项工作。 :[
TIA
这里有一些不协调的编码。 C#代码将文本编码为UTF-16LE。但是然后你声明一个名为'Utf8Stream'的变量,但是使用'TEncoding.ANSI'。您是否清楚了解正在使用的编码? –
@DavidHeffernan我也尝试过使用其他编码。我没有更改我的测试用例的变量名称。对不起。 – rmbl