Portál AbcLinuxu, 14. května 2025 00:06
byte data[]=...;
ByteArrayOutputStream bos= new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(bos);
gos.write(data);
gos.flush();
gos.finish();
byte srcBuf[]=bos.toByteArray()
int srcBufLen=srcBuf.length;
Ako v C dostanem z toho srcBuf pôvodné dáta? (zápis do súboru/volanie externého gunzip, nie je to, čo hľadám)
Podľa RFC
keď char *srcBuf
posuniem o veľkosť hlavičky (10 bajtov - pretože FLG je 0)
tak by som mal byť na začiatku komprimovaných dát, a tie
by som mohol rozbaliť cez uncompress()
srcBuf+=sizeof(id1)+sizeof(id2)+sizeof(cm)+sizeof(flg)+sizeof(mtime )+sizeof(xfl)+sizeof(os);
err=uncompress(dstBuf,&dstBufLen,srcBuf,srcBufLen-sizeof(crc32)-sizeof(isize));
Ale nefunguje to. V err
ostanem Z_DATA_ERROR
. Gzip taký buffer rozbaliť vie. Poradí mi niekto?
apt-get install zlib1g-dev
z_stream strm;
strm.next_in=srcBuf;
strm.avail_in=srcBufLen;
strm.zalloc=Z_NULL;
strm.zfree=Z_NULL;
strm.opaque=Z_NULL;
strm.next_out=dstBuf;
strm.avail_out=dstBufLen;
err=inflateInit2(&strm,47);
err=inflate(&strm,Z_FINISH);
err=inflateEnd(&strm);
Trik robí to "47". Vyhrabal som to v jednom z tých examplov. Žiaľ, dokumentácia to moc dobre nevysvetľuje (resp. hovorí, že by to malo byť v rozsahu 8-15, a aj tak mi nie je jasné, prečo to zafunguje).
inflateInit2()
, aby se pokusila detekovat hlavicku.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.