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;
	}
}