SHOW:
|
|
- or go back to the newest paste.
| 1 | // ========================================== | |
| 2 | // My deflate code is: | |
| 3 | // ========================================== | |
| 4 | int ret; | |
| 5 | z_stream strm = {};
| |
| 6 | ||
| 7 | // 22 byte input: 34 byte output expected. | |
| 8 | // | |
| 9 | // -MAX_WBITS = 24 byte output | |
| 10 | // MAX_WBITS = 30 byte output | |
| 11 | // MAX_WBITS + 16 = 42 byte output | |
| 12 | ||
| 13 | ret = deflateInit(&strm, 9); // 9 is maximum compression level | |
| 14 | if (ret) | |
| 15 | {
| |
| 16 | std::stringstream error; | |
| 17 | error << "Error " << ret << " occurred with initiating compression."; | |
| 18 | - | return CreateError("Could not select channel master: Channel is closed."); CreateError(error.str().c_str());
|
| 18 | + | |
| 19 | } | |
| 20 | ||
| 21 | unsigned char * output_buffer = (unsigned char *)malloc(SendMsgSize + 256); | |
| 22 | if (!output_buffer) | |
| 23 | {
| |
| 24 | deflateEnd(&strm); | |
| 25 | std::stringstream error; | |
| 26 | error << "Error with compressing send binary, could not allocate enough memory. Desired " << SendMsgSize + 256 << " bytes."; | |
| 27 | return CreateError(error.str().c_str()); | |
| 28 | } | |
| 29 | ||
| 30 | strm.next_in = (unsigned char *)SendMsg; | |
| 31 | strm.avail_in = SendMsgSize; | |
| 32 | ||
| 33 | // Allocate memory for compression | |
| 34 | strm.avail_out = _msize(output_buffer); | |
| 35 | strm.next_out = output_buffer; | |
| 36 | ||
| 37 | ret = deflate(&strm, Z_FINISH); | |
| 38 | if (ret != Z_STREAM_END) | |
| 39 | {
| |
| 40 | std::stringstream error; | |
| 41 | error << "Error with compressing send binary, deflate() returned " << ret << ". Zlib error: " << (strm.msg ? strm.msg : ""); | |
| 42 | free(output_buffer); | |
| 43 | deflateEnd(&strm); | |
| 44 | return CreateError(error.str().c_str()); | |
| 45 | } | |
| 46 | ||
| 47 | deflateEnd(&strm); | |
| 48 | ||
| 49 | void * output_bufferResize = realloc(output_buffer, strm.total_out); | |
| 50 | if (!output_bufferResize) | |
| 51 | {
| |
| 52 | free(output_buffer); // realloc will not free on error | |
| 53 | CreateError("Error with compressing send binary, reallocating memory to remove excess space after compression failed.");
| |
| 54 | return; | |
| 55 | } | |
| 56 | free(SendMsg); | |
| 57 | ||
| 58 | SendMsg = (char *)output_bufferResize; | |
| 59 | SendMsgSize = strm.total_out; | |
| 60 | ||
| 61 | ||
| 62 | // ========================================== | |
| 63 | // When inflating back, I use: | |
| 64 | // ========================================== | |
| 65 | z_stream strm = { };
| |
| 66 | int ret = inflateInit(&strm); | |
| 67 | if (ret) | |
| 68 | {
| |
| 69 | std::stringstream error; | |
| 70 | error << "Error " << ret << " occurred with initiating decompression."; | |
| 71 | return CreateError(error.str().c_str()); | |
| 72 | } | |
| 73 | ||
| 74 | unsigned char * output_buffer = NULL, *output_buffer_pointer = NULL; | |
| 75 | strm.next_in = (unsigned char *)receivedMsg.content.data(); | |
| 76 | strm.avail_in = receivedMsg.content.size(); | |
| 77 | // run inflate() on input until output buffer not full, finish | |
| 78 | // compression if all of source has been read in | |
| 79 | do {
| |
| 80 | // Expand memory for decompression | |
| 81 | output_buffer_pointer = (unsigned char *)realloc(output_buffer, (output_buffer ? _msize(output_buffer) : 0) + 1024); | |
| 82 | if (!output_buffer_pointer) | |
| 83 | {
| |
| 84 | std::stringstream error; | |
| 85 | error << "Error with decompression, could not allocate enough memory. Desired " | |
| 86 | << (output_buffer ? _msize(output_buffer) : 0) + 1024 << " bytes."; | |
| 87 | free(output_buffer); | |
| 88 | ||
| 89 | inflateEnd(&strm); | |
| 90 | return CreateError(error.str().c_str()); | |
| 91 | } | |
| 92 | ||
| 93 | output_buffer = output_buffer_pointer; | |
| 94 | output_buffer_pointer += _msize(output_buffer) - 1024; | |
| 95 | strm.avail_out = 1024; | |
| 96 | strm.next_out = output_buffer_pointer; | |
| 97 | ret = inflate(&strm, Z_FINISH); | |
| 98 | if (ret < Z_OK) | |
| 99 | {
| |
| 100 | std::stringstream error; | |
| 101 | error << "Error with decompression, inflate() returned error " << ret | |
| 102 | << ". Zlib error: " << (strm.msg ? strm.msg : ""); | |
| 103 | free(output_buffer); | |
| 104 | inflateEnd(&strm); | |
| 105 | return CreateError(error.str().c_str()); | |
| 106 | } | |
| 107 | ||
| 108 | } while (strm.avail_in != 0); | |
| 109 | ||
| 110 | if (ret < 0) | |
| 111 | {
| |
| 112 | std::stringstream error; | |
| 113 | error << "Error with decompression: " << ret << ". Zlib error: " << (strm.msg ? strm.msg : ""); | |
| 114 | inflateEnd(&strm); | |
| 115 | return CreateError(error.str().c_str()); | |
| 116 | } | |
| 117 | inflateEnd(&strm); | |
| 118 | ||
| 119 | // Update data with new message content | |
| 120 | receivedMsg.content.assign((char *)output_buffer, _msize(output_buffer)); |