Hi All, Is it possible to output the content of a particular file from a zip file? For example, in the attached ziptest.c I want to get the contents of a particular file Class3.class from testclasses.zip into a buffer, can anyone point out what I need to change in the code? Thx in advance Prasanta Sadhukhan wrote: >> Thanks Glynn. >> I tried to rectify the flaw and now I am getting the whole file >> contents from the zip file, ie., it is outputting the contents of the >> file stored in the zipfile. >> But Actually, I wanted only to list the content of the zip file as >> zipinfo does. >> >> Regards >> Prasanta >> Glynn Clements wrote: >>> Prasanta Sadhukhan wrote: >>> >>> >>>> I have tried to create a ziptest code with the information found >>>> but when I tried to inflate the contents by calling inflate() >>>> [line68], I am getting Z_DATA_ERROR citing input data is corrupted >>>> or not conforming to zlib format but I can do zipinfo or unzip on >>>> the attached ziptest.zip file successfully (and also the zip header >>>> is found to be valid by the header validity check done in the program) >>>> Can anyone point me as to what should I being more to get rid of >>>> this problem? >>>> >>> >>> I've found 3 flaws: >>> >>> 1. You're not skipping over the variable-length fields (file name and >>> extra field) at the end of the header; add: >>> >>> fseek(file, SH(&h[LOCFIL]), SEEK_CUR); >>> fseek(file, SH(&h[LOCEXT]), SEEK_CUR); >>> >>> after reading the header but before calling inf(). >>> >>> 2. You're trying to inflate() everything up to end-of-file, when you >>> should be using the compressed length from the header (LOCSIZ) to >>> determine how much compressed data is available (even with only one >>> file, the central directory occurs at the end of the file). >>> >>> 3. This one wasn't obvious until I looked at the unzip source code. >>> You need to call inflateInit2(&strm, -15) rather than inflateInit(), >>> in order to have it process "raw" data. zlib.h says: >>> >>> windowBits can also be -8..-15 for raw inflate. In this case, >>> -windowBits >>> determines the window size. inflate() will then process raw >>> deflate data, >>> not looking for a zlib or gzip header, not generating a check >>> value, and not >>> looking for any check values for comparison at the end of the >>> stream. This >>> is for use with other formats that use the deflate compressed >>> data format >>> such as zip. ... >>> >>> IOW, inflateInit() expects the data to be "wrapped" with a zlib or >>> gzip header and trailer, but ZIP files don't have these. >>> >>> After fixing the above issues, I get C source code on stdout. >>> >>> >>