来自socket.recv的python字节到int []

时间:2018-02-07 17:30:58

标签: python python-2.7 sockets

我正在使用python 2.7

中的以下代码编写自己的DNS查询
import socket

domain = 'example.com'
UDP_IP = "8.8.8.8"
UDP_PORT = 53

packet = [88, 89, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0]

for part in domain.split('.'):
    packet.append(len(part))
    for char in list(part):
        packet.append(ord(char))

packet += [0, 0, 15, 0, 1]

print packet

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(bytearray(packet), (UDP_IP, UDP_PORT))
data = sock.recv(1024)
sock.close()

print repr(data)

打印出以下内容:

[88, 89, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 101, 120, 97, 109, 112, 108, 101, 3, 99, 111, 109, 0, 0, 15, 0, 1]
'XY\x81\x80\x00\x01\x00\x00\x00\x01\x00\x00\x07example\x03com\x00\x00\x0f\x00\x01\xc0\x0c\x00\x06\x00\x01\x00\x00\x01z\x00-\x03sns\x03dns\x05icann\x03org\x00\x03noc\xc0-xHoU\x00\x00\x1c \x00\x00\x0e\x10\x00\x12u\x00\x00\x00\x0e\x10'

但是如何将返回的字节(似乎以字符串形式出现)转换回int[]

C#中的代码如下所示:

byte[] recv = udpclient.Receive(IPEndPoint);

int[] resp = new int[recv.Length];
for (int i = 0; i < resp.Length; i++)
    resp[i] = Convert.ToInt32(recv[i]);

它在IDE中的外观(pyCharm) enter image description here

1 个答案:

答案 0 :(得分:0)

列表理解(参见:https://docs.python.org/3.6/tutorial/datastructures.html#list-comprehensions)似乎是“转换”的正确行动方案:

data = [ord(i) for i in data]

或者只是在从套接字接收时执行此操作:

data = [ord(i) for i in sock.recv(1024)]