Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с упаковкой

1.9K
06 ноября 2006 года
disasm
232 / / 06.02.2006
using System.IO.Compression & .NET framework 2.0

Есть функции для упаковки/распаковки массива байт
Код:
public static byte[] Pack(byte[] buf,int len)
{
    MemoryStream s0 = new MemoryStream(len+100000);
    s0.SetLength(0);
    s0.Seek(0,0);
    GZipStream s = new GZipStream(s0,CompressionMode.Compress);
    s.Write(buf,0,len);
    byte[] bf = new byte[s0.Length];
    s0.Seek(0,0);
    int res=s0.Read(bf,0,(int)s0.Length);
    return bf;
}
       
public static byte[] UnPack(byte[] buf,int len)
{
    MemoryStream s0 = new MemoryStream(len);
    GZipStream s = new GZipStream(s0,CompressionMode.Decompress);
    s0.Write(buf,0,len);
    s0.Seek(0,SeekOrigin.Begin);
    s0.SetLength(len);
    byte[] bf = new byte[len*10];
    int l=s.Read(bf,0,(int)bf.Length);
    byte[] bf2 = new byte[l];
    Buffer.BlockCopy(bf, 0, bf2, 0, l);
    return bf2;
}


Так вот с эти кодом такая проблема:
файлик размером 12800 байт упаковывается в 8496 байт, а потом эти же данные распаковываются в 11304 байта(!), причем эти 11304 байта являются первыми 11304 байтами исходный данных (т.е. после распаковки кусок данных из конца куда-то исчезает)

Подскажите, пожалуйста, где может быть ошибка или как лучше сделать.
22K
07 ноября 2006 года
Melnosta
7 / / 07.11.2006
Все прекрасно заработает, когда будешь работать с еще открытым потоком. Для этого просто нужно задать 3-й аргумент в true и закрывать поток по завершению работ.

Код:
public static byte[] Pack(byte[] buf,int len)
{
    MemoryStream s0 = new MemoryStream(len+100000);
    s0.SetLength(0);
    s0.Seek(0,0);
    GZipStream s = new GZipStream(s0,CompressionMode.Compress, true);
    s.Write(buf,0,len);
    s.Close();
    byte[] bf = new byte[s0.Length];
    s0.Seek(0,0);
    int res=s0.Read(bf,0,(int)s0.Length);
    return bf;
}
       
public static byte[] UnPack(byte[] buf,int len)
{
    MemoryStream s0 = new MemoryStream(len);
    GZipStream s = new GZipStream(s0,CompressionMode.Decompress, true);
    s0.Write(buf,0,len);
    s0.Seek(0,SeekOrigin.Begin);
    s0.SetLength(len);
    byte[] bf = new byte[len*10];
    int l=s.Read(bf,0,(int)bf.Length);
    s.Close();
    byte[] bf2 = new byte[l];
    Buffer.BlockCopy(bf, 0, bf2, 0, l);
    return bf2;
}


ps. Пакует этот gzip очень хреново. может стоит попровать использовать более продвинутые алгоритмы? Обычным zip'ом например - быстро и эффективно.
1.9K
08 ноября 2006 года
disasm
232 / / 06.02.2006
Спасибо, а где взять этот zip? Мне нужно именно сжатие не файлов, а куска файла размером около 1к-10к

PS: у меня есть библиотека классов в виде .dll. Как ее прикрутить к проге? Пользуюсь SharpDevelop-ом 1.1.0

Заранее спасибо
22K
08 ноября 2006 года
Melnosta
7 / / 07.11.2006
Все зависит от сжимаемых данных. Если много повторяющихся или простых данных, то используй gzip.
В противном случае gzip будет не уменьшать размер твоих данных, а увеличивать. В этом случае лучше zip-овать данные. Что мешает создать виртуальный файл через поток и внего все запихнуть? А затем обратно все вытащить...

Попробуй использовать ZipForge.Net
http://www.torry.ru/net/compress/std/zf.net120.zip
Или SharpZipLib
http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
Или еще кучу других библиотек
http://www.google.ru/search?q=C%23+zip&hl=ru&lr=&start=0&sa=N

ps. Прикручивается точно также как и в Visual Studio - кликаешь правой кнопкой в проекте на References->Add Reference->.Net as browser->выбираешь нужную dll-ку. затем добавляешь в нужном модуле using ... и вуаля! :)
273
15 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
По поводу сжатия через GZIP в FAQ этого раздела написано.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог