Thread: Packing 7 bits into 8 ("PUUUSSSSHHH!")

  1. #1
    Registered /usr
    Join Date
    Aug 2001
    Location
    Newport, South Wales, UK
    Posts
    1,273

    Post Packing 7 bits into 8 ("PUUUSSSSHHH!")

    Hello,

    I'm trying to write two small functions that compresses/decompresses 7-bit data that is packed together into 8 bits. These are my alogrithms:-
    Code:
    int compress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src;
    	unsigned char *dest;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		rshift = 6;
    		for (lshift=1;lshift<8;lshift++)
    		{
    			*dest |= (*(src++) & 0x7F) << lshift;
    			*(dest++) |= (*src & 0x7F) >> rshift--;
    		}
    	}
    	return 0;
    }
    
    int decompress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src;
    	unsigned char *dest;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 15120) //size of imput data
    	{
    		rshift = 6;
    		for (lshift=1;lshift<8;lshift++)
    		{
    			*(dest++) |= (*src & (0x7F << lshift)) >> lshift;
    			*dest |= (*(src++) & (0x7F >> rshift)) << rshift--;
    		}
    	}
    	return 0;
    }
    I'm not sure this is right though (The decompressed data certainly isnt...) Help?

  2. #2
    Registered /usr
    Join Date
    Aug 2001
    Location
    Newport, South Wales, UK
    Posts
    1,273
    I had drawn the process out previously and now how since revised the iterations to look like this:-
    Code:
    (Compress/pack)
    mask1 = 0x7F, mask2 = 0x40;
    *(dest++) |= ((*(src++) & mask1) << 1) | ((*src & mask2) >> 6);
    
    mask1 = 0x3F, mask2 = 0x60;
    *(dest++) |= ((*(src++) & mask1) << 2) | ((*src & mask2) >> 5);
    
    mask1 = 0x1F, mask2 = 0x70;
    *(dest++) |= ((*(src++) & mask1) << 3) | ((*src & mask2) >> 4);
    
    mask1 = 0x0F, mask2 = 0x78;
    *(dest++) |= ((*(src++) & mask1) << 4) | ((*src & mask2) >> 3);
    
    mask1 = 0x07, mask2 = 0x7C;
    *(dest++) |= ((*(src++) & mask1) << 5) | ((*src & mask2) >> 2);
    
    mask1 = 0x03, mask2 = 0x7E;
    *(dest++) |= ((*(src++) & mask1) << 6) | ((*src & mask2) >> 1);
    
    mask1 = 0x01, mask2 = 0x7F;
    *(dest++) |= ((*(src++) & mask1) << 7) | ((*src & mask2) >> 0);
    
    
    (Decompress/unpack)
    mask1 = 0x00, mask2 = 0xFE;
    *(dest++) |= ((*src & mask2) >> 1);
    
    mask1 = 0x01, mask2 = 0xFC;
    *(dest++) |= ((*(src++) & mask1) << 6) | ((*src & mask2) >> 2);
    
    mask1 = 0x03, mask2 = 0xF8;
    *(dest++) |= ((*(src++) & mask1) << 5) | ((*src & mask2) >> 3);
    
    mask1 = 0x07, mask2 = 0xF0;
    *(dest++) |= ((*(src++) & mask1) << 4) | ((*src & mask2) >> 4);
    
    mask1 = 0x0F, mask2 = 0xE0;
    *(dest++) |= ((*(src++) & mask1) << 3) | ((*src & mask2) >> 5);
    
    mask1 = 0x1F, mask2 = 0xC0;
    *(dest++) |= ((*(src++) & mask1) << 2) | ((*src & mask2) >> 6);
    
    mask1 = 0x3F, mask2 = 0x80;
    *(dest++) |= ((*(src++) & mask1) << 1) | ((*src & mask2) >> 7);
    
    mask1 = 0x7F, mask2 = 0x00;
    *(dest++) |= ((*(src++) & mask1) << 0) | ((*src & mask2) >> 8);
    This in turn led me to revise the functions like so:-
    Code:
    int compress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x7F;
    		mask2 = 0x40;
    		rshift = 6;
    		for (lshift=1;lshift<8;lshift++)
    		{
    			*(dest++) |=( (*(src++) & mask1) << lshift) | ((*src & mask2) >> rshift--);
    			mask1 >>= 1;
    			mask2 += (mask2 >> 1);
    		}
    	}
    	return 0;
    }
    
    int decompress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x00;
    		mask2 = 0xFE;
    		rshift = 1;
    		for (lshift=7;lshift>0;lshift--)
    		{
    			if (lshift == 7)
    				*(dest++) |= ((*src & mask2) >> rshift++);
    			else
    				*(dest++) |= ((*(src++) & mask1) << lshift) | ((*src & mask2) >> rshift++);
    
    			mask1 <<= 1;
    			mask1++;
    			mask2 <<= 1;
    		}
    	}
    	return 0;
    }
    I still don't seem to be any closer to outputting meaningful data.

  3. #3
    Registered User
    Join Date
    Oct 2001
    Posts
    2,934
    Try this.
    Code:
    int compress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x7F;
    		mask2 = 0x40;
    		rshift = 6;
    		for (lshift=1;lshift<8;lshift++)
    		{
    			*dest = ( (*(src++) & mask1) << lshift);
    			*dest++ |= ((*src & mask2) >> rshift--);
    			mask1 >>= 1;
    			mask2 |= (mask2 >> 1);
    		}
    		src++;
    	}
    	return 0;
    }
    
    int decompress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x00;
    		mask2 = 0xFE;
    		rshift = 1;
    		for (lshift=7;lshift>=0;lshift--)
    		{
    			if (lshift == 7)
    				*dest++ |= ((*src & mask2) >> rshift++);
    			else
    			{
    				*dest = ((*(src++) & mask1) << lshift);
    				*dest++ |= ((*src & mask2) >> rshift++);
    			}
    
    			mask1 <<= 1;
    			mask1++;
    			mask2 <<= 1;
    		}
    	}
    	return 0;
    }
    Last edited by swoopy; 01-03-2003 at 09:16 AM.

  4. #4
    Registered User
    Join Date
    Jan 2007
    Posts
    5

    help urgent

    THIS code is of SMurf & corrected by swoopy

    plzzz can some one give me whole program means its main function & also comments on each line which help me in understanding this prog as i cant understand
    why
    mask1 = 0x7F;
    mask2 = 0x40;
    rshift = 6;
    this take & while (src - in < 17280)this also why only 17280?
    & also not understand some function also so plzzzzzz help me in this regard & plzz give me main function with comments if u can
    thanks in advance.
    its urgent plzz.

    Hello,

    I'm trying to write two small functions that compresses/decompresses 7-bit data that is packed together into 8 bits. These are my alogrithms:-

    insert
    Code:
    Code:
    
    int compress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x7F;
    		mask2 = 0x40;
    		rshift = 6;
    		for (lshift=1;lshift<8;lshift++)
    		{
    			*dest = ( (*(src++) & mask1) << lshift);
    			*dest++ |= ((*src & mask2) >> rshift--);
    			mask1 >>= 1;
    			mask2 |= (mask2 >> 1);
    		}
    		src++;
    	}
    	return 0;
    }
    
    int decompress(unsigned char *in, unsigned char *out)
    {
    	unsigned char *src, *dest, mask1, mask2;
    	int lshift, rshift;
    
    	src = in;
    	dest = out;
    	while (src - in < 17280) //size of imput data
    	{
    		mask1 = 0x00;
    		mask2 = 0xFE;
    		rshift = 1;
    		for (lshift=7;lshift>=0;lshift--)
    		{
    			if (lshift == 7)
    				*dest++ |= ((*src & mask2) >> rshift++);
    			else
    			{
    				*dest = ((*(src++) & mask1) << lshift);
    				*dest++ |= ((*src & mask2) >> rshift++);
    			}
    
    			mask1 <<= 1;
    			mask1++;
    			mask2 <<= 1;
    		}
    	}
    	return 0;
    }

  5. #5
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,666
    4 years - impressive.
    Still closed though.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. SDLKey to ASCII without unicode support?
    By zacs7 in forum Game Programming
    Replies: 6
    Last Post: 10-07-2007, 03:03 AM
  2. Help counting number of bits set in an integer
    By JayDiddums10 in forum C Programming
    Replies: 5
    Last Post: 12-07-2006, 03:21 PM
  3. Writing binary data to a file (bits).
    By OOPboredom in forum C Programming
    Replies: 2
    Last Post: 04-05-2004, 03:53 PM
  4. New idea on conveting byte to bits/bits to byte
    By megablue in forum C Programming
    Replies: 10
    Last Post: 10-26-2003, 01:16 AM
  5. packing and unpacking bits
    By soonerfan in forum C Programming
    Replies: 1
    Last Post: 12-11-2001, 09:40 AM