Python - 通过UDP发送十六进制数组

时间:2016-04-11 22:07:53

标签: python sockets udp hex

是的我知道UDP很糟糕但不幸的是我别无选择 - 我的服务器只接受UDP ...

我所拥有的是包含十六进制值的列表,需要将其发送出UDP。

如果我尝试发送列表,我会 -   ' TypeError:必须是字符串或缓冲区,而不是列表'

如果我转换为字符串(在我的代码中称为aList),我得到 -   ' TypeError:需要一个整数' 打印aList = 09004000e3f00005f5

如果我将aList转换为带有基数16的int,我得到 -   ' TypeError:必须是字符串或缓冲区,而不是长'

怀疑它是基本的东西,但我错过了它。

简单代码看起来像::

import socket   #for sockets    

UDP_PORT    = 21105;
UDP_HOST    = '10.194.34.151';


z21 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def _getLocoInfo (id):
    arr        = [ 0x09, 0x00, 0x40, 0x00, 0xE3, 0xF0, 0x00, id]
    arr.append(arr[5]^arr[6]^arr[7])
    return arr

msg = _getLocoInfo(0x05)
aList = "".join("%02x" % b for b in msg)

print (a)

try :
    z21.send(msg ,(UDP_HOST, UDP_PORT) )
     # receive data from client (data, addr)
    d = s.recvfrom(1024)

    print ('Server reply : ' + reply)

except socket.error as e:
        print ('Error Code : ' + str(e[0]) + ' Message ' + e[1])
        sys.exit()

1 个答案:

答案 0 :(得分:1)

对于python的套接字模块,我不是很了解但是在查看this页面时我觉得你错过了两件事:

  • 尝试使用z21.sendto而不是z21.send
  • 尝试使用bytes()
  • 将您的消息转换为字节缓冲区

所以结果看起来像这样:

... other code

try:
  z21.sendto(bytes(msg) ,(UDP_HOST, UDP_PORT))

... following code

我希望这会有所帮助。