2015-11-17 65 views
0

我在C工作,并承担我有2个字节的小尾数:将2个字节转换为12位数字?

buffer[0] = 0x01; buffer[1] = 0x02; 

我怎么能转换到上述组合12位的数字?所以结合它应该看起来后像:

0x0201 
+2

'0x0201'看起来像一个16位数字。你的意思是'0x201'? – chux

+2

您有2个字节,即16位。 12位是1和半字节。 3个字节将是24位(全部假设为8位字节)。我认为你需要澄清你想要做什么。 – nos

+0

是'char','unsigned char','uint8_t'或其他类型的'buffer []'类型吗? – chux

回答

4

这是一个16位的数。每个字节是8位。

int i = (buffer[0] & 0xFF) | (buffer[1] << 8);

如果你想12位,然后这个

int i = (buffer[0] & 0xFF) | ((buffer[1] & 0x0F) << 8);

转换回缓冲

char buffer[2]; 
buffer[0] = i & 0xFF; 
buffer[1] = (i >> 8) & 0x0F; 
+0

那么,更新这个如何获得12位。 – WalterM

+0

缓冲区是小端,所以这也将它转换回常规形式? – Vimzy

+0

是的。增加了如何将它从int中返回到缓冲区。 – WalterM

2

3个字节(24位)数:

number = ((buffer[2] & 0x0F) << 16) | ((buffer[1] & 0x0F) << 8) | buffer[0]; 

2个字节(16位)数:

number = ((buffer[2] & 0x0F) << 8) | ((buffer[1] & 0x0F) << 4) | buffer[0]; 
+0

对不起,我编辑了我的问题。我只需要将2个字节转换为组合的12位数字? – Vimzy

+2

2个字节组成一个16位数字。我不明白你为什么想着12位数字。 –

+0

加法与OR – WalterM

1

如果buffer[]是有符号类型使用

int twelve_bit1 = ((buffer[1] & 0xF) << 8) | (buffer[0] & 0xFF); 

int twelve_bit2 = ((buffer[1] & 0xF) << 8) | (unsigned char) buffer[0]; 

int twelve_bit3 = ((buffer[1] & 15) * 256) | buffer[0] & 255; 

所有产生类似的代码。