我想在Python脚本中做的是有一个字节数组并附加两个数字,将其作为消息发送,并让接收的C应用程序可以再次读取该数字。
C 应用程序读起来是这样的:
//deserialize srvid from end of payload
UInt16 srvIdFrom;
UInt16 srvIdTo;
srvIdFrom = payload[len-4] | payload[len-3] << 8;
srvIdTo = payload[len-2] | payload[len-1] << 8;
我做了一个Python脚本,尝试像这样做上述事情:
my_bytes = bytearray()
numb = 1
dummySrvId = 1234
srvIdFrom = 5678
my_bytes.append(numb)
my_bytes.append(dummySrvId & 0xff)
my_bytes.append(dummySrvId >> 8)
my_bytes.append(srvIdFrom & 0xff)
my_bytes.append(srvIdFrom >> 8)
但它不起作用。即,以下代码给出以下输出:
srvIdFrom = my_bytes[len(my_bytes)-4] << 8 | my_bytes[len(my_bytes)-3] << 0
srvIdTo = my_bytes[len(my_bytes)-2] << 8 | my_bytes[len(my_bytes)-1] << 0
print('return packet had srvIdFrom {} and srvIdTo {}'.format(srvIdFrom,srvIdTo))
输出
return packet had srvIdFrom 53764 and srvIdTo 44
或者类似的东西。我做错了什么?
按以下顺序追加了字节
my_bytes.append(dummySrvId & 0xff) # -4 (offset from end)
my_bytes.append(dummySrvId >> 8) # -3
my_bytes.append(srvIdFrom & 0xff) # -2
my_bytes.append(srvIdFrom >> 8) # -1
但是在 Python 解码测试中,您随后移动了错误的字节,有效地交换了 MSB 和 LSB 部分:
srvIdFrom = (
my_bytes[len(my_bytes)-4] << 8 # -4 is dummySrvId & 0xff
| my_bytes[len(my_bytes)-3] << 0 # -3 is srvIdFrom >> 8
)
srvIdTo = (
my_bytes[len(my_bytes)-2] << 8 # -2 is srvIdFrom & 0xff
| my_bytes[len(my_bytes)-1] << 0 # -1 is srvIdFrom >> 8
)
后者也与你的 C 代码不匹配;你移动小端字节(偏移量 -3 和 -1(:
srvIdFrom = payload[len-4] | payload[len-3] << 8;
srvIdTo = payload[len-2] | payload[len-1] << 8;
事实上,如果您交换移位并将 C 代码匹配以进行解码,您将获得正确的值:
>>> my_bytes[len(my_bytes)-4] | my_bytes[len(my_bytes)-3] << 8
1234
>>> my_bytes[len(my_bytes)-2] | my_bytes[len(my_bytes)-1] << 8
5678
所以别的不对劲。你的Python编码工作很好。