private int SlurpHeader(byte[] buffer, int offset)
{
int totalSlurped = 0;
byte[] header = new byte[10];
Array.Copy(buffer, offset, header, 0, header.Length);
totalSlurped += header.Length;
offset += header.Length;
if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8)
throw new ZlibException("Bad GZIP header.");
if ((header[3] & 0x04) == 0x04) // There is an extra field
{
// slurp and discard extra field
Int16 extraLength = (Int16)(buffer[10] + buffer[11] * 256);
offset += 2;
byte[] extra = new byte[extraLength];
Array.Copy(buffer, offset, extra, 0, extra.Length);
totalSlurped += extra.Length;
offset += extra.Length;
}
int count = 0;
if ((header[3] & 0x08) == 0x08)
{
FileName = SlurpZeroTerminatedString(buffer, offset, out count);
totalSlurped += count;
offset += count;
}
if ((header[3] & 0x10) == 0x010)
{
Comment = SlurpZeroTerminatedString(buffer, offset, out count);
totalSlurped += count;
offset += count;
}
if ((header[3] & 0x02) == 0x02)
{
// CRC16, ignore the data
totalSlurped += 1;
offset += 1;
}
return totalSlurped;
}