读取UDP数据包

3 投票
1 回答
5635 浏览
提问于 2025-04-15 20:45

我在解析一个UDP数据包时遇到了一些问题。我正在接收这些数据包,并把数据和发送者的地址存储在变量'data'和'addr'中,代码是:

data, addr = UDPSock.recvfrom(buf)

这段代码把数据解析成了字符串,但我现在不知道怎么把它转换成字节。我知道数据包的结构总共有28个字节,而我想提取的数据在第17到28个字节之间。

我试过这样做:

  mybytes = data[16:19]
  print struct.unpack('>I', mybytes)
  --> struct.error: unpack str size does not match format

还有这样:

  response = (0, 0, data[16], data[17], 6)
  bytes = array('B', response[:-1])
  print struct.unpack('>I', bytes)
  --> TypeError: Type not compatible with array type

以及这样:

  print "\nData byte 17:", str.encode(data[17])
  --> UnicodeEncodeError: 'ascii' codec can't encode character u'\xff' in position 0: ordinal not in range(128)

更具体来说,我想解析我认为是无符号整数的内容。但现在我不确定接下来该尝试什么。我对Python中的套接字和字节转换完全是新手,所以任何建议都很有帮助 :)

谢谢,

托马斯

1 个回答

3

一个无符号的32位整数占用4个字节,所以你需要把4个字节传给 struct.unpack

mybytes = data[16:19]

替换成

mybytes = data[16:20]

(右边的数字是第一个不包括的字节,也就是说,range(16,19) = [16,17,18]),这样就没问题了。

撰写回答