在Python中将字节解释为ushort

在Python中将字节解释为ushort,python,arrays,bytearray,Python,Arrays,Bytearray,我需要将通过TCP套接字接收的16个字节解释为8个U端口 这一行正确地接收数据(8个a-d转换器的16位值),我可以访问每个字节作为字节数组的索引: vals = bytearray(s.recv(16)) 我可以创建8个变量并对每个变量进行解码: ad1 = (ord(vals[0]) * 256)+ord(vals[1]) 但如果我能把这个数组重铸成8个U形,那就更优雅了 我尝试了struct.unpack的许多变体,但也有同样多的语法错误。我的背景是C语言,所以我通常会使用union或

我需要将通过TCP套接字接收的16个字节解释为8个U端口

这一行正确地接收数据(8个a-d转换器的16位值),我可以访问每个字节作为字节数组的索引:

vals = bytearray(s.recv(16))
我可以创建8个变量并对每个变量进行解码:

ad1 = (ord(vals[0]) * 256)+ord(vals[1])
但如果我能把这个数组重铸成8个U形,那就更优雅了

我尝试了struct.unpack的许多变体,但也有同样多的语法错误。我的背景是C语言,所以我通常会使用union或重写字节指针,但是

谁能给我指出正确的方向吗?谢谢,如果以前有人问过这个问题,我很抱歉

# 以下是完整的月份:

import socket,struct,time
import xrlib

def readADx(socket,a2dnumber):
# a2dnumber 1 - 8
if a2dnumber < 1 or a2dnumber > 8:
      return 0
a2d = a2dnumber + 0x9D
tdata = struct.pack('BB',0xFE,a2d)
s.send(tdata)
val = ord(s.recv(1)) * 256
val = val + ord(s.recv(1))
return val
#
# define TCP client socket:
# 
IPADDR = '192.168.99.9'
PORTNUM = 2101
s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IPADDR,PORTNUM))
tdata = struct.pack('BB',0xFE,0xA7)
s.send(tdata)
#
# the problem:
#
vals = bytearray(s.recv(16))
adv = struct.unpack('8H',vals)
#
# get the true values for A/D 7 and 8:
#
ad8 = readADx(s,8);
ad7 = readADx(s,7);
s.close()

print("%04X %04X %04X %04X %04X %04X %04X %04X"%adv[0],adv[1],adv[2],adv[3],adv[4],adv[5],adv[6],adv[7]))
print("AD8: %d"%(ad8));
print("AD7: %d"%(ad7));
print("adv[7]: %d"%(adv[7]));
print("adv[6]: %d"%(adv[6]));
这是我在参数长度不同的情况下总是会遇到的错误

此代码适用于:

 adv = struct.unpack('8H',s.recv(16))
但是每次读取的字节顺序(adv[x])是相反的。我找到了socket.ntohs()来修复此问题

仍然不确定struct.unpack为什么不能与bytearray参数一起工作…

(将注释转换为答案)


struct.unpack是正确的方法。如果您向我们展示了您的尝试和错误,我们可能会指出错误所在。
vals
是字节数组,因此
vals[0]
已经是
int
。取
int
ord
也是一个错误。
 adv = struct.unpack('8H',s.recv(16))
ad1 = struct.unpack('8H', vals)