Re: unzip куска данных
От: Pavel_Agurov Россия  
Дата: 22.09.10 11:26
Оценка: 15 (2)
Здравствуйте, Arnx, Вы писали:

>Код на C с использованием zlib для этого есть, A>Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.


Ну если zlib работает, то можно взять zlib.net, наверное

Например, ZLIB.NET Free
Re: unzip куска данных
От: okman Беларусь https://searchinform.ru/
Дата: 06.10.11 17:01
Оценка: 14 (2)
Здравствуйте, Arnx, Вы писали:

A>Ситуация — есть данные в файле, часть из них запакована в gzip формате. Но когда эти данные спихивались в кучу у них у всех отрезался заголовок, который, как я понимаю, должен быть стандартным. Если был хвост, то он, отрезан тоже. Вопрос можно чем-нибудь распаковать такие данные не делая себе кучу головной боли. Код на C с использованием zlib для этого есть, но под C# его переводить — довольно проблемно. Смотрел в сторону DotNetZip, но так и не понял можно ли так сделать.

A>Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.

Если все так, как Вы описали, то класс System.Io.Compression.DeflateStream должен подойти.

Приведу маленькая справку, если кому интересно.

В основе сжатия Zlib и GZip лежит алгоритм Deflate.
Zlib добавляет 2 байта заголовков в начало Deflate-потока и 4 байта контрольной суммы (Adler32) в конец.
У Gzip заголовки другие (обычно 10 или немного больше), а в конце потока CRC32 и 4 байта длины.
Вот и вся разница.

С потоком данных, который сжат любым из этих трех методов, можно работать как с "сырым" Deflate,
если правильно пропустить заголовки и хвост.

Deflate в своей работе использует так называемое "скользящее окно" и для правильного разжатия
Deflate-потока декомпрессор должен иметь размер окна, равный или больший тому, который был
задан при компрессии, иначе получим ошибку. Это единственная, пожалуй, тонкость, которую следует знать.
В библиотеке Zlib, например, размер окна может задаваться явно при создании декомпрессора.
т
unzip куска данных
От: Arnx Россия  
Дата: 22.09.10 08:45
Оценка:
Ситуация — есть данные в файле, часть из них запакована в gzip формате. Но когда эти данные спихивались в кучу у них у всех отрезался заголовок, который, как я понимаю, должен быть стандартным. Если был хвост, то он, отрезан тоже. Вопрос можно чем-нибудь распаковать такие данные не делая себе кучу головной боли. Код на C с использованием zlib для этого есть, но под C# его переводить — довольно проблемно. Смотрел в сторону DotNetZip, но так и не понял можно ли так сделать.
Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.
Re: unzip куска данных
От: Pavel_Agurov Россия  
Дата: 22.09.10 08:52
Оценка:
Здравствуйте, Arnx, Вы писали:

A>Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.


System.IO.Compression.GZipStream ?
Re[2]: unzip куска данных
От: Arnx Россия  
Дата: 22.09.10 08:54
Оценка:
P_A>System.IO.Compression.GZipStream ?
Не проходит — непонятно что именно ему подсовывать в качестве заголовка. Без него ругается на magic number, если пытаться подсунуть то, что я видел как стандартный — то не опознает тип блока.
Re: unzip куска данных
От: Аноним  
Дата: 22.09.10 14:47
Оценка:
Здравствуйте, Arnx, Вы писали:

A>Ситуация — есть данные в файле, часть из них запакована в gzip формате. Но когда эти данные спихивались в кучу у них у всех отрезался заголовок, который, как я понимаю, должен быть стандартным. Если был хвост, то он, отрезан тоже. Вопрос можно чем-нибудь распаковать такие данные не делая себе кучу головной боли. Код на C с использованием zlib для этого есть, но под C# его переводить — довольно проблемно. Смотрел в сторону DotNetZip, но так и не понял можно ли так сделать.

A>Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.

http://blogs.msdn.com/b/bclteam/archive/2007/05/16/system-io-compression-capabilities-kim-hamilton.aspx
Re[2]: unzip куска данных
От: Arnx Россия  
Дата: 23.09.10 15:19
Оценка:
P_A>Ну если zlib работает, то можно взять zlib.net, наверное
Спасибо, с ней таки получилось, хотя мапил сишные примеры в C# я довольно долго.
Потом наткнулся на похожую библиотеку, где были очень похожие вызовы с нормально описанными значениями входных и выходных параметров.
В итоге вышло просто, что-то вроде
zlib.ZStream stream = new zlib.ZStream();
stream.next_in = buf32k;
stream.avail_in = buf32k.Length;
initRes = stream.inflateInit(); ///0 - good
stream.next_out = outBuffer;
stream.avail_out = (int)entity.RealSize;
..
rc = stream.inflate(zlib.zlibConst.Z_NO_FLUSH);
..
stream.inflateEnd();

Спасибо за подсказку.
Re[3]: unzip куска данных
От: Аноним  
Дата: 19.08.11 10:27
Оценка:
Здравствуйте, Arnx, Вы писали:

P_A>>Ну если zlib работает, то можно взять zlib.net, наверное

A>Спасибо, с ней таки получилось, хотя мапил сишные примеры в C# я довольно долго.
A>Потом наткнулся на похожую библиотеку, где были очень похожие вызовы с нормально описанными значениями входных и выходных параметров.
A>В итоге вышло просто, что-то вроде
A>
A>zlib.ZStream stream = new zlib.ZStream();
A>stream.next_in = buf32k;
A>stream.avail_in = buf32k.Length;
A>initRes = stream.inflateInit(); ///0 - good
A>stream.next_out = outBuffer;
A>stream.avail_out = (int)entity.RealSize;
A>..
A>rc = stream.inflate(zlib.zlibConst.Z_NO_FLUSH);
A>..
A>stream.inflateEnd();
A>

A>Спасибо за подсказку.
Re[3]: unzip куска данных
От: Аноним  
Дата: 19.08.11 10:33
Оценка:
Здравствуйте, Arnx.

Не могли бы Вы выслать полный листинг кода?
Re: unzip куска данных
От: Pavel Dvorkin Россия  
Дата: 20.08.11 09:06
Оценка:
Здравствуйте, Arnx, Вы писали:

A>Ситуация — есть данные в файле, часть из них запакована в gzip формате. Но когда эти данные спихивались в кучу у них у всех отрезался заголовок, который, как я понимаю, должен быть стандартным. Если был хвост, то он, отрезан тоже. Вопрос можно чем-нибудь распаковать такие данные не делая себе кучу головной боли. Код на C с использованием zlib для этого есть, но под C# его переводить — довольно проблемно.


Оформить код на С в виде DLL с одной функцией и вызвать через P/Invoke ?
With best regards
Pavel Dvorkin
Re: unzip куска данных
От: Beketata  
Дата: 06.10.11 16:38
Оценка:
Здравствуйте, Arnx, Вы писали:

A>Ситуация — есть данные в файле, часть из них запакована в gzip формате. Но когда эти данные спихивались в кучу у них у всех отрезался заголовок, который, как я понимаю, должен быть стандартным. Если был хвост, то он, отрезан тоже. Вопрос можно чем-нибудь распаковать такие данные не делая себе кучу головной боли. Код на C с использованием zlib для этого есть, но под C# его переводить — довольно проблемно. Смотрел в сторону DotNetZip, но так и не понял можно ли так сделать.

A>Т.е. фактически есть буфер byte[] и его надо раззиповать, размер после распаковки есть.

Если вы точно знаете, что данные запакованы gzip-ом, то в .NET есть для этого спец. класс DeflateStream

// buf - Это входной байтовый буфер без "заголовка" и "хвоста" с запакованными данными
// bw - Это выходной поток, куда вы распаковываете ( у меня это был BinaryWriter )

using( MemoryStream inStream = new MemoryStream( buf ) )
using( DeflateStream ds = new DeflateStream( inStream, CompressionMode.Decompress ) )
{
  ds.CopyTo( bw.BaseStream );
}


zlib — это другой стандарт сжатия.
.
.
.
Начало разное бывает ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.