User (Old forums)MemberApril 28, 2015 at 8:49 amPost count: 23064
I am compressing/uncompressing memory to memory using the Xceed API DLL functions:
// Compress method
XCD_IMPORT int XCD_WINAPI XcCompress( HXCEEDCMP hComp, const BYTE* pcSource, DWORD dwSourceSize, BYTE** ppcCompressed, DWORD* pdwCompressedSize, BOOL bEndOfData );
// Uncompress method
XCD_IMPORT int XCD_WINAPI XcUncompress( HXCEEDCMP hComp, const BYTE* pcSource, DWORD dwSourceSize, BYTE** ppcUncompressed, DWORD* pdwUncompressedSize, BOOL bEndOfData );To uncompress I need to pass the dwSourceSize, eg. the size of the compressed buffer. However, as this buffer is stored in a byte container larger than the actual compressed data I need a way to figure out the size of the actual compressed data. There are two methods I can do myself:1) Assuming that the compressed data never ends with a zero (0), I could look for the end of compressed data by looking for the first none-zero by searching the buffer reverse,2) I can store a 4 byte size value leading the actual compressed data. The buffer must of course be large enough to hold both. Before uncompressing I read the compressed size value. I have tested this method and it works fine.A third more elegant method would be to use information already in the compressed buffer:3) I assume the compressed data contains a structure (header) of some sort. Maybe that structure includes the compressed size info, like it apparently does for the checksum? Is there any documentation for the compressed data when compressing to memory using the above function?The tip in post #28379 does not apply ( http://xceed.com/CS/forums/permalink/28379/28379/ShowThread.aspx#28379 )Thanks in advance for any helpful info.
Imported from legacy forums. Posted by Viggo (had 459 views)Xceed SupportMemberMay 20, 2015 at 1:45 pmPost count: 5658
You will find the description of the header and footer around the compressed data here.
However, this should not be needed. If you used the Deflated compression method, Uncompress() will detect the end of the compressed data itself even if the source buffer you supply is larger than the compressed data. This works because the Deflated compression format contains internal block markers that allow the engine to detect when decompression needs to end.
Understand that this approach will only work if the entire compressed data is located in a single compressed buffer. This means that when you call Uncompress(), the endOfData parameter value will be ‘true’.
Imported from legacy forums. Posted by Jb [Xceed] (had 344 views)
- You must be logged in to reply to this topic.