Преобразование байтов, полученных сокетом, в плавающее в Python 3 - PullRequest
0 голосов
/ 20 ноября 2018

Я попытался следовать предложенному ответу здесь, но не получил ожидаемый результат: Python Socket Полученный ASCII преобразовать в фактические числа (с плавающей запятой)

Я получаю данные в байтовом формате примерно так, используя socket.recv ():

      b'(1,3,-121.551552,-123.602531,-40.582172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'

Я пытаюсь получить приведенные выше значения в виде списка из 30 чисел с плавающей запятой.

Я понимаю, что мы должны использовать библиотеку структур, но я сталкиваюсь с трудностями, пытаясь понять концепцию форматирования.

1 Ответ

0 голосов
/ 20 ноября 2018

Ваши входящие числа не имеют фиксированной длины, за исключением 6 десятичных шагов, если вообще. Так почему бы просто не использовать bytes.decode(), затем снять скобки и разделить запятыми?

С каждым шагом разбито:

>>> b = b'(1,3,-121.551552,-123.602531,-40.582172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'
>>> b.decode()
'(1,3,-121.551552,-123.602531,-40.582172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)'
>>> b.decode()[1:-1]
'1,3,-121.551552,-123.602531,-40.582172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
>>> b.decode()[1:-1].split(',')
['1', '3', '-121.551552', '-123.602531', '-40.582172', '0', '0', '0', '0', '0', '0', '0',
 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
>>> [float(x) for x in b.decode()[1:-1].split(',')]
[1.0, 3.0, -121.551552, -123.602531, -40.582172, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 0.0, 0.0, 0.0, 0.0]

И еще Pythonic способ сделать это за последний шаг:

>>> list(map(float, b.decode()[1:-1].split(',')))
[1.0, 3.0, -121.551552, -123.602531, -40.582172, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
...