Reputation: 1965
I'm working in C, and assume I have 2 bytes in little endian:
buffer[0] = 0x01; buffer[1] = 0x02;
How can I convert the above into a combined 12 bit number? So after combining it should look like:
0x0201
Upvotes: 0
Views: 5236
Reputation: 2706
This is a 16 bit number. each byte is 8 bits.
int i = (buffer[0] & 0xFF) | (buffer[1] << 8);
If you want 12 bits then this
int i = (buffer[0] & 0xFF) | ((buffer[1] & 0x0F) << 8);
Convert back to buffer
char buffer[2];
buffer[0] = i & 0xFF;
buffer[1] = (i >> 8) & 0x0F;
Upvotes: 5
Reputation: 206567
3 bytes (24 bits) number:
number = ((buffer[2] & 0x0F) << 16) | ((buffer[1] & 0x0F) << 8) | buffer[0];
2 bytes (16 bits) number:
number = ((buffer[2] & 0x0F) << 8) | ((buffer[1] & 0x0F) << 4) | buffer[0];
Upvotes: 2
Reputation: 153338
In case buffer[]
is a signed type use
int twelve_bit1 = ((buffer[1] & 0xF) << 8) | (buffer[0] & 0xFF);
or
int twelve_bit2 = ((buffer[1] & 0xF) << 8) | (unsigned char) buffer[0];
or
int twelve_bit3 = ((buffer[1] & 15) * 256) | buffer[0] & 255;
All generate similar code.
Upvotes: 1