Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Unpacking Characters from an Integer

I’m trying to update 16 bit code to 32 bit code and unpack a given unsigned int to 4 characters. It’s working alright except in two spots. I just started with this concept so I’m not strong with it yet. Can anyone please explain why two of the characters don’t show up.

#include <stdio.h>
// prototypes
void unpackCharacters32(char *aPtr, char *bPtr, char *cPtr, char *dPtr, unsigned int pack);
void displayBits(unsigned int value);
int main(void)
{
 // display bits of packed
 unsigned int packed = 1818978115; // initialize packed value
 puts("The packed character representation is:");
 displayBits(packed);
 char a; // first character unpacked
 char b;// second character unpacked
 char c;
 char d;
 unpackCharacters32(&a, &b, &c,&d, packed);
 printf("\nThe unpacked characters are \'%c\',\'%c\',\'%c\' and \'%c\'\n", a, b,c,d);
 displayBits(a);
 displayBits(b);
 displayBits(c);
 displayBits(d);
}
// unpack two characters from pack
void unpackCharacters32(char *aPtr, char *bPtr, char *cPtr, char *dPtr, unsigned int pack)
{
 unsigned int mask1=4278190080; // mask for first character
 unsigned int mask2=16711680; // mask for second character
 unsigned int mask3=65280;
 unsigned int mask4=255;

 *aPtr = (pack & mask1)>>8; // separate first character
 *bPtr = (pack & mask2)>>8; // separate second character
 *cPtr = (pack & mask3)>>8;
 *dPtr = (pack & mask4);
}
// display the bits of value
void displayBits(unsigned int value)
{
 unsigned int displayMask = 1 << 31; // bit mask
 printf("%7u = ", value);
 // loop through bits
 for (unsigned int c = 1; c <= 32; c++) {
 value & displayMask ? putchar('1') : putchar('0');
 value <<= 1; // shift value 1 bit to the left

 if (c % 8 == 0) { // print a space
 putchar(' ');
 }
 }
 putchar('\n');
}

here’s what its supposed to look like

Pack: 1818978115➔ output should be ‘l’, ‘k’, ‘g’, and ‘C’

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

here’s what I’m getting

The unpacked characters are '','','g' and 'C'
      0 = 00000000 00000000 00000000 00000000 
      0 = 00000000 00000000 00000000 00000000 
    103 = 00000000 00000000 00000000 01100111 
     67 = 00000000 00000000 00000000 01000011 

>Solution :

You’re not shifting correctly. Since mask1 matches the high-order byte, you have to shift 3 bytes down, not just 1 byte. So it should be

*aPtr = (pack & mask1)>>24;
*bPtr = (pack & mask2)>>16;
*cPtr = (pack & mask3)>>8;
*dPtr = (pack & mask4);
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading