00001
00007 #include <pack.h>
00008 #include <appconfig.h>
00009
00010 #define ANDUPTO(X) \
00011 ((1<<((X)-1)) | (1<<((X)-2)) | (1<<((X)-3)) | (1<<((X)-4)) | \
00012 (1<<((X)-5)) | (1<<((X)-6)) | (1<<((X)-7)) | (1<<((X)-8)))
00013
00022 void
00023 PackBits(void *src, void *dest, UInt8 nbits, UInt32 count)
00024 {
00025 UInt8 *dest2 = (UInt8 *)dest;
00026 UInt8 *src2 = (UInt8 *)src;
00027 UInt8 offset = 8;
00028
00029 *dest2 = 0;
00030 while (--count) {
00031 UInt8 val = *src2 & ANDUPTO(nbits);
00032 src2++;
00033 if (offset == 0) {
00034 dest2++;
00035 *dest2 = 0;
00036 offset = 8;
00037 }
00038 if (offset > nbits) {
00039 offset -= nbits;
00040 *dest2 |= val << (offset);
00041 } else {
00042 UInt8 lam = nbits - offset;
00043 *dest2 |= val >> lam;
00044 offset = 8 - lam;
00045 dest2++;
00046 *dest2 = val << offset;
00047 }
00048 }
00049 }
00050
00062 void
00063 UnpackBits(void *src, void *dest, UInt8 nbits, UInt32 count)
00064 {
00065 UInt8 *dest2 = (UInt8 *)dest;
00066 UInt8 *src2 = (UInt8 *)src;
00067 UInt8 offset = 8;
00068 UInt8 and = ANDUPTO(nbits);
00069
00070 while (count--) {
00071 UInt8 val;
00072 if (offset == 0) {
00073 src2++;
00074 offset = 8;
00075 }
00076 if (offset >= nbits) {
00077 offset -= nbits;
00078 val = (*src2 >> offset) & and;
00079 } else {
00080
00081 UInt8 lam = nbits - offset;
00082 val = (*src2 & ANDUPTO(offset)) << lam;
00083 offset = 8 - lam;
00084 src2++;
00085 val |= (*src2 >> offset) & ANDUPTO(lam);
00086 }
00087 *((UInt8 *)dest2) = val;
00088 dest2++;
00089 }
00090 }
00091