2010-07-05 60 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