Мне нужно реализовать специальную реализацию ZLib, которая должна работать под .Net и Mono.
Сообщения данных / строк принимаются через сокет и, следовательно, контрольная сумма отсутствует.
Это касается необработанных строковых данных, а не файлов.
unsigned char zlib_header[]={
// custom additional Zlib Id
'Z', // Our own ID
// The normal GZIP header
0x1f,
0x8b, // GZIP ID
0x08, // Deflated
0x00, // Flags
0, 0, 0, 0, // Timestamp,
0x00, // Extra flags
0x00, // OS identifier
// afterwards compressed data without a checksum
};
Я пытался распаковать данные с помощью GZipStream и DeflateStream, но я думаю, что GZStream дает сбой из-за пропущенной контрольной суммы. Я также пробовал различные смещения, но не повезло.
Контрольная сумма не используется, потому что данные все равно принимаются через сокет - таким образом, контрольная сумма ZLib будет дополнительными издержками.
Я что-то пропустил или не могли бы вы мне объяснить, как добавить контрольную сумму и вызвать нужную библиотеку, или мне следует обратиться к сторонней библиотеке, которая поддерживает Mono и .Net?
Изменить: производительность очень важна, так как это делается по крайней мере раз в секунду. Вы бы порекомендовали мне в конце использовать C-Lib через Interop?
В настоящее время я всегда получаю исключение недействительных данных и предполагаю, что оно связано с неверной контрольной суммой.
Это фактический код, который я пытался использовать без успеха:
const int HeaderSize = 1;
System.IO.MemoryStream ms = new System.IO.MemoryStream(compressedBuffer, HeaderSize, compressedBuffer.Length-HeaderSize);//remove the additional Z from the header
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress,true);
byte[] deCompressedBytes = new byte[actualBufferLength* 10];
int resultSize=zipStream.Read(deCompressedBytes, 0, actualBufferLength);//get rid of the header
UTF8Encoding enc = new UTF8Encoding();
string result = enc.GetString(deCompressedBytes, 0, resultSize);