【发布时间】:2015-09-10 10:12:03
【问题描述】:
在我的应用程序中,我构建了一个 xml 结构并将其发送到 delphi 客户端。在那个 xml 的标签中,我有一个压缩的 base64 编码字符串:
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);
}
我的 Delphi 客户端必须从该标记中获取数据并再次将其转换为基本字符串。不幸的是,我得到了一个
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 解压代码的理解,或者我是一个真正的愚蠢的人。但不幸的是,我不明白我如何才能完成这项工作。 :[
TIA
【问题讨论】:
-
这里有一堆乱七八糟的编码。 C# 代码将文本编码为 UTF-16LE。但随后您声明了一个名为
Utf8Stream的变量,但使用TEncoding.ANSI。您对正在使用的编码有清晰的了解吗? -
@DavidHeffernan 我也尝试了其他编码。我没有更改我的测试用例的变量名。很抱歉。