Как сжать строку в .net С# и распаковать ее во flash as3?

Мне нужно загрузить большой xml во флэш-память, и я пытаюсь отправить его в сжатом виде. Для этого я попытался сжать строку zlib и отправить ее в кодировке base64. Во flash я превращаю строку в массив байтов и использую метод 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 и распаковать ее во флэш-памяти?


person bfi    schedule 23.06.2010    source источник


Ответы (2)


Я заставил его работать с ZLIB.NET. Мне просто нужно было установить кодировку ASCII Encoding.ASCII.GetBytes(str);

person bfi    schedule 23.06.2010
comment
Что касается производительности, он превращает xml размером 6,5 МБ в строку размером 43 КБ. У меня нет времени протестировать скорость декодирования flash, но на моем стареньком Core 2 Duo 2 ГГц кажется очень быстрым. - person bfi; 23.06.2010
comment
+1 Я некоторое время искал код, который работает для сжатия, и ваш комментарий, а также ваш оригинальный комментарий был первым, который действительно сработал. Спасибо Спасибо спасибо. - person Ian Overton; 03.04.2013

Flash не поддерживает сжатие zip в версии плагина. Делает только gzip. Только если вы компилируете для AIR, у вас есть возможность использовать zip. Итак, если вы нацелены на браузер, вам понадобится кодировщик gzip на стороне С# (я думаю, что это GZipStream)

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

person Quasimondo    schedule 23.06.2010
comment
Да, из документации: Flash Player поддерживает только алгоритм по умолчанию, zlib. Вот почему я пытаюсь использовать zlib в .net. Или я что-то здесь упускаю? - person bfi; 23.06.2010
comment
P.S. Я уже пробовал GZipStream (второй пример из моего поста), из библиотеки DotNetZip. Я делаю то же самое, что и System.IO.Compression, только лучше. - person bfi; 23.06.2010
comment
О, я вижу - я как-то только что посмотрел ваш третий пример и проигнорировал второй. - person Quasimondo; 23.06.2010