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 байтами исходный данных (т.е. после распаковки кусок данных из конца куда-то исчезает)
Подскажите, пожалуйста, где может быть ошибка или как лучше сделать.
Код:
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;
}
{
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'ом например - быстро и эффективно.
PS: у меня есть библиотека классов в виде .dll. Как ее прикрутить к проге? Пользуюсь SharpDevelop-ом 1.1.0
Заранее спасибо
В противном случае 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 ... и вуаля! :)
По поводу сжатия через GZIP в FAQ этого раздела написано.