2015-11-17 68 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; 

所有產生類似的代碼。