ZIP library UncompressData()
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 21:22, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R9.5-R11
Platform: Windows ; Mac ; Mac OSX ;
Language(s) : C++ ;---------
Okay, a simple question:Does UncompressData() understand partial buffers due to file reads for zlib decompression?
I'm reading a set number of bytes (per round) from a zlib-compressed file and then calling UncompressData(). So far, it always errors out at UncompressData(). I assume that the pDestData argument returns a pointer to a memory buffer that C4D allocated (thus the required GeFree()). ZBUFLEN = 65536L. I'm sorry - it is not possible to expect to be able to allocate a memory buffer to hold possible files (they may be in the hundreds of Megabytes!). Here's the method involved:
>
// Decompress infile into outfile, return outfile \> //\*---------------------------------------------------------------------------\* \> Bool myZLib::DecompressFile(const Filename& inname, const Filename& outname, char\* buf) \> //\*---------------------------------------------------------------------------\* \> { \> AutoAlloc<BaseFile> out; \> AutoAlloc<BaseFile> in; \> if (!(in && out)) return FALSE; \> \> if (!in->Open(inname, GE_READ, FILE_NODIALOG, GE_INTEL)) \> { \> GePrint("Error: in->Open"); \> return FALSE; \> } \> if (!out->Open(outname, GE_WRITE, FILE_NODIALOG, GE_INTEL)) \> { \> GePrint("Error: out->Open"); \> return FALSE; \> } \> #ifdef OS64 \> VLONG len; \> #else \> LONG len; \> #endif \> LONG olen; \> char\* obuf; \> for (;;) \> { \> len = in->ReadBytes(buf, ZBUFLEN); \> if (len < 0) \> { \> GePrint("Error: len < 0"); \> return FALSE; \> } \> if (len == 0) return TRUE; \> if (!UncompressData(buf, len, (void\*&)obuf, olen)) \> { \> GePrint("Error: UncompressData"); // ALWAYS ERRORS HERE! \> return FALSE; \> } \> if (!out->WriteBytes(obuf, olen)) \> { \> GeFree(obuf); \> GePrint("Error: WriteBytes"); \> return FALSE; \> } \> GeFree(obuf); \> } \> if (!out->Close()) \> { \> GePrint("Error: out->Close"); \> return FALSE; \> } \> if (!in->Close()) \> { \> GePrint("Error: in->Close"); \> return FALSE; \> } \> return TRUE; \> }
Thanks,
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 23:25, xxxxxxxx wrote:
Hi!
You only want to decrompress zip files?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 23:30, xxxxxxxx wrote:
zlib compressed files. Zip files 'use' zlib compression but also include other information (such as folder/file structures). These files are simply compressed using zlib compression.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 23:32, xxxxxxxx wrote:
I used the class "ZipFile" to extract a zip file with its directory structure. You are able to read and write comments, and other stuff too.
A few lines are enough to extract the whole content of a zip file to a directory. A small code snippet:
zlib
See my last post.Bye...
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 23:39, xxxxxxxx wrote:
Supposedly, CompressData() and UncompressData() work with zlib compressed data.
Remember that there is a difference between this and zip files. I've already tried using the 'zip' library on these files without success - because they aren't zip archives. They are just single files that have been zlib compressed (think RLE encoding).
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/09/2008 at 23:46, xxxxxxxx wrote:
Hi!, ah, ok.. I see..
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/09/2008 at 13:32, xxxxxxxx wrote:
Bumping this up.
Yes, indeed CompressData() and UncompressData() work if the full buffer is being compressed or decompressed. I converted all the zlib-compressed memory buffer code and these work splendidly.
It appears that, unlike the zlib stream support provided by gzOpen()/gzRead()/gzClose(), the C4D SDK routines cannot handle segmented buffer decompression - all or nothing. 'All' is not going to be a viable option here.
Any thoughts here?