чтение двоичных данных из сокета в Python - PullRequest
2 голосов
/ 03 июля 2011

Когда я запускаю следующий пример кода Python,

tick = 0
while True:
    tick += 1
    print tick
    data = s.recv(1024)
    if (tick == 1) and data:
        print 'from client: %s' %(data)
    elif (tick == 2) and data:
        print 'from client: %s' %(data)

Я вижу,

1
from client: client msg
2
from client: ?
3

Моя интуиция подсказывает мне, что второй вызов s.recv () фактически возвращает некоторые данные,И я вполне уверен, что клиент не отправляет `? 'символ.

Таким образом, я изменяю код, надеясь напечатать первый байт `data ',

    elif (tick == 2) and data:
        print 'from client: %s' %(data)
        print struct.unpack("!B", data)

Но затем я получаю трассировку, заявляющую:" struct.error: unpack требует строкуаргумент длины 1. "

Пакет struct, кажется, является стандартным способом обработки данных сокета.Однако такая ситуация кажется странной.Я получаю данные визуально, печатая и вижу "?"и в коде также есть «и данные» в условном выражении, но я не могу распаковать.

Есть ли другой способ обработки двоичных данных из сокета?

Ответы [ 3 ]

5 голосов
/ 03 июля 2011
elif (tick == 2) and data:
        print 'from client: %r' % data # (note 1)
        print struct.unpack("!B", data[0]) # (note 2)
  1. Напечатайте изображение, как предложил Игнасио.
  2. Вы хотите распаковать один байт, поэтому дайте struct.unpack один байт.
2 голосов
/ 03 июля 2011

Вы можете просмотреть необработанное представление объекта, вызвав repr() или используя спецификатор форматирования %r.

0 голосов
/ 03 июля 2011

Похоже, вы пытаетесь интерпретировать полученные данные, не зная, что представляют собой полученные данные.Вы можете отправить кодировку в формате unicode или двоичные данные в кодировке ascii или utf-8 (целые числа, jpg или фильм) через сокет.Ваша функция приема должна быть адаптирована к тому, что было отправлено.

Если вы знаете, что это двоичный файл, вы просто отправляете байты?Потому что это все распаковка ("! B", data [0]) (как предложено TZ ...) даст вам.Если это так, я считаю, что ответ правильный.

Вы должны иметь возможность использовать len (данные), чтобы выяснить, сколько было получено, и вы должны убедиться, что вы проверили, есть ли у вас частичное чтение (попытка отправить 1025 байтов и только получение 1024).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...