Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. //comp()
  5. void Compress(unsigned char *szOut, const char *szMessage) {
  6.     unsigned long long nBuffer = 0; //This is enough to store 8 uncompressed characters or 9 compressed. We will only use 8 tho.
  7.     char nBitsInBuffer = 0;
  8.     while (*szMessage != 0) {
  9.         nBuffer |= (unsigned long long)(*szMessage++ & 0x7F) << nBitsInBuffer;
  10.         nBitsInBuffer += 7;
  11.         if (nBitsInBuffer == 7 * 8) { //We have 8 chars in the buffer, dump them
  12.             while (nBitsInBuffer > 0) {
  13.                 *szOut++ = nBuffer & 0xFF;
  14.                 nBuffer >>= 8;
  15.                 nBitsInBuffer -= 8;
  16.             }
  17.             //The following should be redundant, but just to be safe
  18.             nBitsInBuffer = 0;
  19.             nBuffer = 0;
  20.         }
  21.     }
  22.     //Write out whatever is left in the buffer
  23.     while (nBitsInBuffer > 0) {
  24.         *szOut++ = nBuffer & 0xFF;
  25.         nBuffer >>= 8;
  26.         nBitsInBuffer -= 8;
  27.     }
  28. }
  29.  
  30. //uncomp()
  31. //nCompressedLen is the number of bytes in the compressed buffer.
  32. //NOTE: the compressed buffer does not have a NULL terminating character
  33. void Uncompress(char *szOut, const unsigned char *szCompressed, unsigned nCompressedLen) {
  34.     unsigned long long nBuffer = 0; //This is enough to store 8 uncompressed characters or 9 compressed. We will only use 8 tho.
  35.     char nBitsInBuffer = 0;
  36.     while (nCompressedLen) {
  37.         while (nCompressedLen && nBitsInBuffer < 7 * 8) {
  38.             nBuffer |= (unsigned long long)*szCompressed++ << nBitsInBuffer;
  39.             nBitsInBuffer += 8;
  40.             --nCompressedLen;
  41.         }
  42.         while (nBitsInBuffer > 0) {
  43.             *szOut++ = nBuffer & 0x7F;
  44.             nBuffer >>= 7;
  45.             nBitsInBuffer -= 7;
  46.         }
  47.         //The following should be redundant, but just to be safe
  48.         nBitsInBuffer = 0;
  49.         nBuffer = 0;
  50.     }
  51. }
  52.  
  53. int main() {
  54.     //char szMessage[] = "\x53\x7F\x63\x4B";
  55.     char szMessage[] = "hello world. this is a compressed long string";
  56.     static const unsigned nCompressedSize = sizeof(szMessage) * 7 / 8; //This does not include the NULL terminating character from the string
  57.     unsigned char pCompressedBytes[nCompressedSize];
  58.     char szUncompressed[sizeof(szMessage)];
  59.     printf("     Message: %s\n", szMessage);
  60.     Compress(pCompressedBytes, szMessage);
  61.     printf("  Compressed: ");
  62.     for (int nByte = 0; nByte < nCompressedSize; ++nByte) {
  63.         printf("%02X ", pCompressedBytes[nByte]);
  64.     }
  65.     printf("\n");
  66.     Uncompress(szUncompressed, pCompressedBytes, nCompressedSize);
  67.     szUncompressed[sizeof(szMessage) - 1] = 0; //We need to terminate the string. The NULL terminator is not stored in the compressed bytes
  68.     printf("Uncompressed: %s\n", szUncompressed);
  69.     //Now just verify that we ended up with the same message we started with
  70.     if (strcmp(szMessage, szUncompressed) == 0) {
  71.         printf("Compression works\n");
  72.     } else {
  73.         printf("Compression failed\n");
  74.     }
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement