Python3:如何将附加到字节数组的数字作为字节附加

Python3:如何将附加到字节数组的数字作为字节附加,python,byte,Python,Byte,在Python脚本中,我想做的是拥有一个bytearray并向其附加两个数字,将其作为消息发送,然后让接收的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

在Python脚本中,我想做的是拥有一个bytearray并向其附加两个数字,将其作为消息发送,然后让接收的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;
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))

或者类似的东西。我做错了什么?

您按以下顺序追加了字节

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
)
srvIdFrom=(
my_字节[len(my_字节)-4]8
)
srvIdTo=(
my_字节[len(my_字节)-2]8
)
后者也与您的C代码不匹配;移动小的endian字节(偏移量-3和-1):


srvIdFrom=payload[len-4]| payload[len-3]>my_bytes[len(my_bytes)-4]| my_bytes[len(my_bytes)-3]>>my_bytes[len(my_bytes)-2]| my_bytes[len(my_bytes)-1](dummySrvId&0xff)在按字节数组追加后给出b.”的输出。无法理解表示法。@取消掩码:使用
my_bytes[-3]
查看数值,但您有一个字节恰好是可打印的ASCII字符,这就是为什么它显示为一个。读
b'abc'
比读
字节([97,98,99])
更容易。
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
)
srvIdFrom = payload[len-4]  | payload[len-3] << 8;
srvIdTo = payload[len-2]  | payload[len-1] << 8;
>>> 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