\C\Advanced
Long_Pack.c
#include/* unsigned long PackToUL_A(int Vals[]) void PackToUL_B(int Vals[], unsigned long *ulPacked) int UnPack_A(unsigned long ulPacked, int *Val) int UnPack_B(unsigned long ulPacked, unsigned long *NewPack, int iCount) */ #define PACK(x, i) (x << (8 * (i))) #define UNPACK(x, i) (x >> (8 * (i))) unsigned long PackToUL_A(int Vals[]) { unsigned long tmp, pack; int i = 0; tmp = pack = 0; i = 0; while(i < 4) { tmp = PACK(Vals[i], i); pack += tmp; i++; } return pack; } void PackToUL_B(int Vals[], unsigned long *ulPacked) { unsigned long tmp, pack; int i = 0; tmp = pack = 0; i = 0; while(i < 4) { tmp = PACK(Vals[i], i); pack += tmp; i++; } ulPacked = (unsigned long *)pack; } int UnPack_A(unsigned long ulPacked, int *Val) { int iTmp[4], i; if(ulPacked == 0) { printf("No Numbers Packed"); return 0; } else { for(i=0;i<4;i++) iTmp[i] = 0; i = 3; while(i >= 0) { iTmp[i] = UNPACK(ulPacked, i); ulPacked -= PACK(iTmp[i], i); if(iTmp[i] == -1) { printf("Value of -1 unpacked"); return 0; } Val[i] = iTmp[i]; i--; } } return 1; } int UnPack_B(unsigned long ulPacked, unsigned long *NewPack, int iCount) { int Val = 0; if(iCount > 3) { printf("Error you cant have more than 4 numbers packed\n"); return 0; } else { Val = (int)UNPACK(ulPacked, iCount); if(Val <= -1) { Val = 0; printf("Val of < -1 has been returned: %u\n", Val); } ulPacked -= PACK(Val, iCount); NewPack = (unsigned long *)ulPacked; return Val; } }