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’
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);