在Python中将字节解释为ushorts

时间:2015-03-13 01:13:26

标签: python arrays bytearray

我需要将通过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 ...

一起使用

1 个答案:

答案 0 :(得分:3)

(将评论转换为答案)

ad1 = struct.unpack('8H', vals)