fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define WINDOW_SIZE 1024 // 10-bit sliding window (2^10 = 1024)
  6. #define MAX_LENGTH 15 // 4-bit length (2^4 - 1 = 15)
  7. #define MIN_MATCH 3 // Minimum match length to encode as a pair
  8.  
  9. #define WINDOW_SIZE_N_BITS 10 // 10-bit sliding window
  10. #define MAX_LENGTH_N_BITS 4 // 4-bit length
  11.  
  12. #define size_t unsigned int
  13. #define uint8_t unsigned char
  14. #define uint32_t unsigned int
  15.  
  16. uint8_t dict[WINDOW_SIZE+MAX_LENGTH+MIN_MATCH];
  17. int dict_pos = 0;
  18.  
  19. int get_bit(const unsigned char *buffer, size_t bit_position) {
  20. size_t byte_index = bit_position / 8;
  21. size_t bit_offset = bit_position % 8;
  22. return (buffer[byte_index] >> (7 - bit_offset)) & 0x01;
  23. }
  24.  
  25. void set_bit(uint8_t *buffer, size_t bit_position, int value) {
  26. size_t byte_index = bit_position / 8;
  27. size_t bit_offset = bit_position % 8;
  28. if (value) {
  29. buffer[byte_index] |= (1 << (7 - bit_offset));
  30. } else {
  31. buffer[byte_index] &= ~(1 << (7 - bit_offset));
  32. }
  33. }
  34. void lzss_decompress(const unsigned char *input, int input_size, unsigned char *output, int *output_size) {
  35. int input_pos = 0;
  36. int output_pos = 0;
  37. uint8_t offset[2] = {0};
  38. uint8_t length = 0;
  39. uint8_t flag = 0;
  40.  
  41. while (input_pos < (input_size*8) ) {
  42. // Read flag bit
  43. flag = get_bit(input,input_pos++);
  44. if (flag == 1) {
  45. // Literal: read the next 8 bits
  46. for (int i = 0; i < 8; i++) {
  47. set_bit(output,output_pos++,get_bit(input,input_pos++));
  48. }
  49. dict[dict_pos++] = output[(output_pos-1)/8];
  50. } else {
  51. // Pair: read 10-bit offset and 4-bit length
  52. for (int i = 0; i < WINDOW_SIZE_N_BITS; i++) {
  53. set_bit(offset,i,get_bit(input,input_pos++));
  54. }
  55. for (int i = 0; i < MAX_LENGTH_N_BITS; i++) {
  56. set_bit(&length,i,get_bit(input,input_pos++));
  57. }
  58. length +=2;
  59. for (int i = 0; i < length; i++) {
  60. output[(output_pos-1)/8] = dict[dict_pos-(unsigned int)offset[0]+i];
  61. output_pos += 8;
  62. dict[dict_pos++] = output[(output_pos-1)/8];
  63.  
  64. }
  65. }
  66. }
  67.  
  68. // *output_size = output_pos;
  69. }
  70.  
  71. int main() {
  72. // Write C code here
  73. int size_out = 50;
  74. unsigned char Buf_Out[1024]={0};
  75. unsigned char Buf_in[1024]={0xFF,0x80,0x11,0xE2,0xC0,0x40,0x30,0x41,0xA0,0x11,0x29,0xA5,0x58,0x00,0x00};
  76. lzss_decompress(Buf_in,15,Buf_Out,&size_out);
  77. for (int i = 0; i < 20; i++) {
  78. printf("%x ", Buf_Out[i]);
  79. }
  80.  
  81. return 0;
  82. }
Success #stdin #stdout 0.01s 5284KB
stdin
45
stdout
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c5