【问题标题】:How to compress a string in .net c# and decompress it in flash as3?如何在 .net c# 中压缩字符串并在 flash as3 中解压缩?
【发布时间】:2010-06-23 14:14:01
【问题描述】:

我必须在 Flash 中加载一个大的 xml,并且我正在尝试将其压缩发送。为此,我尝试 zlib 压缩字符串并将其发送 base64 编码。在闪存中,我将字符串转换为字节数组并使用它的 uncompress() 方法。到目前为止,我尝试过:

ZLIB.NET

byte[] bytData = System.Text.Encoding.UTF8.GetBytes(str);
MemoryStream ms = new MemoryStream();
Stream s = new zlib.ZOutputStream(ms, 3);
s.Write(bytData, 0, bytData.Length);
s.Close();
byte[] compressedData = (byte[])ms.ToArray();
return System.Convert.ToBase64String(compressedData);

Ionic.Zlib (DotNetZip)

return System.Convert.ToBase64String(Ionic.Zlib.GZipStream.CompressBuffer(System.Text.Encoding.UTF8.GetBytes(str)));

ICSharpCode.SharpZipLib(不知道怎么设置压缩到zlib)

byte[] a = Encoding.Default.GetBytes(str);
MemoryStream memStreamIn = new MemoryStream(a);
MemoryStream outputMemStream = new MemoryStream();
ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
ZipEntry newEntry = new ZipEntry("zipEntryName");
newEntry.DateTime = DateTime.Now;
zipStream.PutNextEntry(newEntry);
StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]);
zipStream.CloseEntry();
zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream.
zipStream.Close(); // Must finish the ZipOutputStream before using outputMemStream.
byte[] byteArrayOut = outputMemStream.ToArray();
return System.Convert.ToBase64String(byteArrayOut);

所有结果都不同,但 flash 会抛出错误 #2058:解压缩数据时出错。

var decode:ByteArray = Base64.decodeToByteArray(str);
decode.uncompress();
return decode.toString();

Base64 类来自这里 http://code.google.com/p/as3crypto/source/browse/trunk/as3crypto/src/com/hurlant/util/Base64.as?r=3

那么,如何在 .net 中压缩字符串并在 flash 中解压缩?

【问题讨论】:

    标签: .net flash actionscript-3 string zlib


    【解决方案1】:

    我让它与 ZLIB.NET 一起工作。我只需要将编码设置为 ASCII Encoding.ASCII.GetBytes(str);

    【讨论】:

    • 就性能而言,它将 6.5 MB 的 xml 转换为 43 KB 的字符串。我没有时间测试闪存解码速度,但在我的旧 Core 2 Duo 2 GHz 上似乎非常快。
    • +1 我一直在寻找可用于压缩的代码,而您的评论以及您的原始评论是第一个真正起作用的代码。谢谢谢谢谢谢。
    【解决方案2】:

    Flash 在插件版本中不支持 zip 压缩。它只做gzip。仅当您为 AIR 编译时,您才可以选择使用 zip。因此,如果您的目标是浏览器,则需要在 c# 端使用 gzip 编码器(我认为是 GZipStream)

    http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/utils/ByteArray.html#uncompress%28%29

    【讨论】:

    • 是的,来自文档:“Flash Player 仅支持默认算法 zlib”。这就是我尝试在.net 中使用zlib 的原因。还是我在这里遗漏了什么?
    • P.S.我已经尝试过 DotNetZip 库中的 GZipStream(我的帖子中的第二个示例)。我做的和 System.IO.Compression 一样,只是更好。
    • 哦,我明白了 - 我不知何故只是看了你的第三个例子,而忽略了第二个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多