RLE Decompress

RLE (Run-length encoding) is a very simple form of lossless data compression in which runs of data (that is, sequences in which the same data value occurs in many consecutive data elements) are stored as a single data value and count, rather than as the original run. This is most useful on data that contains many such runs.

For RLE Compress algorithm click here.



									/*****Please include following header files*****/
// stdint.h
/***********************************************/

void Decompress(uint8_t* input, uint8_t* output, uint32_t inputSize) {
	uint8_t marker, symbol;
	uint32_t i, inputPosition, outputPosition, count;

	if (inputSize < 1)
	{
		return;
	}

	inputPosition = 0;
	marker = input[inputPosition++];
	outputPosition = 0;

	do
	{
		symbol = input[inputPosition++];

		if (symbol == marker)
		{
			count = input[inputPosition++];

			if (count <= 2)
			{
				for (i = 0; i <= count; ++i)
				{
					output[outputPosition++] = marker;
				}
			}
			else
			{
				if (count & 0x80)
				{
					count = ((count & 0x7f) << 8) + input[inputPosition++];
				}

				symbol = input[inputPosition++];

				for (i = 0; i <= count; ++i)
				{
					output[outputPosition++] = symbol;
				}
			}
		}
		else
		{
			output[outputPosition++] = symbol;
		}
	} while (inputPosition < inputSize);
}
								


Example

									/*****Please include following header files*****/
// stdlib.h
/***********************************************/

uint8_t* decompressedData = (uint8_t*)malloc(originalDataSize);

Decompress(compressedData, decompressedData, compressedDataSize);