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.