Как мне декодировать данные, когда я не знаю кодировку - PullRequest
0 голосов
/ 09 декабря 2018

Я получаю данные, используя сервер OSC, и данные выглядят так:

b'Person0/elements/alpha_absolute\x00,dddd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xbbP\x128\xe6/\xd4\x00\x00\x00\x00\x00\x00\x00\x00'
b'Person0/elements/alpha_absolute\x00,dddd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xbbOw\x8f\xa7\xac\x10\x00\x00\x00\x00\x00\x00\x00\x00'
b'Person0/elements/alpha_absolute\x00,dddd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xbb\x10\x1f\xf2JN\xed\x00\x00\x00\x00\x00\x00\x00\x00'
b'Person0/elements/alpha_absolute\x00,dddd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xbah[\nY\xe9K\x00\x00\x00\x00\x00\x00\x00\x00'
b'Person0/elements/alpha_absolute\x00,dddd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xb8\x8f\x97\xb1\x04\xc4B\x00\x00\x00\x00\x00\x00\x00\x00'

Название данных: Person0 / elements / alpha_absolute и аргументы: dddd (4 числа с плавающей запятой)

Остальное вроде закодировано.Я не понимаю, как получить 4 числа с плавающей точкой, которые я должен получить

Это весь мой код:

import socket

print('Program Initiated')
UDP_IP = "127.0.0.1"
UDP_PORT = 6000

sock = socket.socket(socket.AF_INET,  # Internet
                 socket.SOCK_DGRAM)  # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(2048)  # buffer size is 1024 bytes

if 'alpha' in str(data):
    print(data)

1 Ответ

0 голосов
/ 10 декабря 2018

Используйте это:

title,args,flt1,flt2,flt3,flt4 = struct.unpack('>32s8sdddd', data)

Поскольку вы ничего не знаете о структуре, это основано на следующих предположениях:

  1. Поле title являетсястрока длиной не более 32 байтов, потому что она является текстовой строкой, а 32-й байт всегда является 0.
  2. Поле args - это строка длиной не более 8 байтов, потому что это то, что остается, когда вы предполагаете…
  3. каждый из четырех «поплавков» имеет длину 8 байтов и, таким образом, технически равен double float.Последние 8 байтов всегда все 0.Это допустимое двойное число (на самом деле 0);все 8 байтов перед ними являются действительными числами с плавающей точкой в ​​формате с прямым порядком байтов, что составляет 2 действительных числа с плавающей точкой.Таким образом, считая в обратном направлении, еще 2 нуля должны быть двумя другими значениями, а несколько оставшихся байтов должны принадлежать полю args.

Запуск unpack на предоставленных данных дает вам эторезультат:

b'Person0/elements/alpha_absolute\x00' b',dddd\x00\x00\x00' 0.0 0.0 0.1066905392564757 0.0
b'Person0/elements/alpha_absolute\x00' b',dddd\x00\x00\x00' 0.0 0.0 0.10668132073594472 0.0
b'Person0/elements/alpha_absolute\x00' b',dddd\x00\x00\x00' 0.0 0.0 0.10571479478158681 0.0
b'Person0/elements/alpha_absolute\x00' b',dddd\x00\x00\x00' 0.0 0.0 0.10315484049525485 0.0
b'Person0/elements/alpha_absolute\x00' b',dddd\x00\x00\x00' 0.0 0.0 0.09594104835265774 0.0

, где единственное, что примечательно, так это то, что из четырех предметов с плавающей запятой только один фактически используется.

...