// encode a 12 bit signed integer into 2 characters
// bit 7 of first character is 1 to indicated encoded data
void RSencode(unsigned char data[2], int idata)
{
data[0]= 0x80 | ((idata>>8)&0x0f) ; // top 4 bits of data
data[1]= idata & 0xff; // lower 8 bits of data
}
// decode the above data, return 1 for sucess else 0
int RSdecode(unsigned char data[2], int *idata)
{
if(! (data[0] & 0x80)) return 0; // NOT encoded data
*idata= ((data[0] << 8) & 0x0f00) | (data[1] & 0xff) ;
// sign extend to 32 bit integer
if(*idata & 0x800) *idata |= 0xfffff000;
return 1;
}
int main()
{
int data =1100, data1, data2=-1100;
unsigned char ch[2];
RSencode(ch, data);
if(RSdecode(ch, &data1)) printf("result = %d\n", data1);
else printf("decode failed\n");
RSencode(ch, data2);
if(RSdecode(ch, &data1)) printf("result = %d\n", data1);
else printf("decode failed\n");
}