2010-07-05 63 views
1

我正在使用專有協議來傳輸整數作爲16位二進制補碼。先發送LSB,然後發送MSB。以下代碼是否可以恢復原始值正確?加入一個16位有符號整數(二進制補碼)的MSB和LSB

unsigned char message[BLK_SIZE]; 
// read LSB to message[0] and MSB to message[1] 
short my_int = (message[1] << 8) | message[0]; 
+0

看起來OK我 - 是什麼讓你認爲它可能是不正確的? – 2010-07-05 15:55:39

+0

是的,它看起來沒問題。你應該爲它寫一個測試,它會告訴你在你的特定應用程序的上下文中它是否可以。 – 2010-07-05 15:55:46

+0

@保羅:啊,我應該提到這一點。我不確定,因爲:1)IIRC短不保證是16位。如果它的8或32發生了什麼? 2)使用無符號字符操作並將其分配給短期工作,如預期的那樣? – Marco 2010-07-05 16:01:07

回答

1

我相信如果short是不是16位,所以你的代碼可能會在某些平臺上失敗的代碼將失敗。儘管如此,你可能永遠找不到一個失敗的平臺。

int16_t,如果您的目標平臺可用,可能是更好的選擇。

+0

int16_t從哪裏來?那是標準的C++,c還是一些POSIX的東西? – Marco 2010-07-05 16:03:48

+0

短褲必須至少有16位,所以代碼是OK的。 – 2010-07-05 16:05:26

+0

http://linux.die.net/man/3/int16_t – codymanix 2010-07-05 16:06:41

0

您的代碼看起來是正確的,但你可以使用固有的C函數來確保你的協議是真正的平臺獨立的:

short my_int = ntohs(*(short*)message)

+0

他希望針對他自己的協議進行特定的轉換。 – 2010-07-05 16:08:13