Чтение пакетов UDP - PullRequest
       12

Чтение пакетов UDP

3 голосов
/ 23 марта 2010

У меня возникли проблемы при разборе 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)

Более конкретно, я хочу разобрать то, что я считаю неподписанным int. И теперь я не уверен, что попробовать дальше. Я совершенно новичок в сокетах и ​​байтовых преобразованиях в Python, поэтому любой совет будет полезен:)

Спасибо, Томас

1 Ответ

3 голосов
/ 23 марта 2010

Неподписанный int32 имеет длину 4 байта, поэтому вы должны передать 4 байта в struct.unpack.

Заменить

mybytes = data[16:19]

с

mybytes = data[16:20]

(правильное число - это первый не включенный байт, т. Е. Диапазон (16,19) = [16,17,18]), и вам следует идти вперед

...