我需要将通过TCP套接字接收的16个字节解释为8个ushorts。
这一行正确接收数据(8个a-d转换器的16位值),我可以访问每个字节作为字节数组的索引:
vals = bytearray(s.recv(16))
我可以创建8个变量并对每个变量进行解码:
ad1 = (ord(vals[0]) * 256)+ord(vals[1])
但是如果我能将这个数组改为8个小时,它会更优雅。
我尝试过struct.unpack的许多变体,语法错误也很多。我的背景是在C中,所以我通常会使用一个联合或重铸一个字节指针,但是......
有人能指出我正确的方向吗?谢谢,如果以前有人问过我,我很抱歉。
#这是完整的monty:
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]));
运行此命令会出现此错误:
struct.error: unpack requires a string argument of length 16
这是我不可避免地得到的错误,不同的参数长度。
此代码有效:
adv = struct.unpack('8H',s.recv(16))
但每个读数(adv [x])的字节顺序相反。我找到了socket.ntohs()来解决这个问题。
仍然不确定为什么struct.unpack不能与bytearray arg ...
一起使用答案 0 :(得分:3)
(将评论转换为答案)
ad1 = struct.unpack('8H', vals)