不知道特定编码时如何解码数据

时间:2019-02-19 00:25:51

标签: python encoding hex osc

我正在使用OSC服务器接收数据,数据看起来像这样:

sorted(some_list, some_func, True)

我正在尝试从这些编码序列中解码4个浮点数。

这是我的完整代码:

b'Muse-C46F/elements/alpha_absolute\x00\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'Muse-C46F/elements/alpha_relative\x00\x00\x00,ffff\x00\x00\x00\x7f\xc0\x00\x00\x7f\xc0\x00\x00\x7f\xc0\x00\x00\x7f\xc0\x00\x00'
b'Muse-C46F/elements/alpha_session_score\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'Muse-C46F/elements/alpha_absolute\x00\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

我看到了一个类似的问题,并使用了print('Program Initiated') UDP_IP = "192.168.2.57" UDP_PORT = 4000 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) while True: data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes if 'alpha' in str(data): print(struct.unpack('>32s8sffff', data)) ,但由于错误而出现了print(struct.unpack('>32s8sffff', data))

1 个答案:

答案 0 :(得分:0)

这些OSC消息包括三个部分:

  • 地址(应该以{{1​​}}开头)
  • 类型标记字符串,其开头为b'/',并定义了后面的参数的类型和数量
  • 消息参数,由类型标记字符串定义。

在问题提供的数据中,每个消息包含36或40个字节的地址,然后是5个字节的标记类型字符串。不考虑初始逗号,标记类型字符串由四个'f'组成,因此我们希望参数由四个浮点数组成,包括16个字节(每个浮点数4个)。

每个消息在四个float所需的16个字节之后都有一些额外的字节;让我们假设 * 这些是可以丢弃的填充。

因此结构格式将是:可变数量的地址字符,五个标记类型字符和四个浮点数。

然后提取数据所需的代码如下:

$ cat osc.py

b','

生成此输出:

  import struct

  data = [
     b"Muse-C46F/elements/alpha_absolute\x00\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
     b"Muse-C46F/elements/alpha_relative\x00\x00\x00,ffff\x00\x00\x00\x7f\xc0\x00\x00\x7f\xc0\x00\x00\x7f\xc0\x00\x00\x
     b"Muse-C46F/elements/alpha_session_score\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
     b"Muse-C46F/elements/alpha_absolute\x00\x00\x00,ffff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
  ]

  if __name__ == "__main__":
      for msg in data:
          num_address_bytes = msg.index(b",")
          num_argument_bytes = len(msg) - (num_address_bytes + 5)
          num_extra_bytes = num_argument_bytes - 16
          address, type_, *floats = struct.unpack(
              ">{}s5s4f".format(num_address_bytes), msg[:-num_extra_bytes]
          )
          print(address, type_, floats)

* 进行假设通常不是一个好主意。如果OSC服务器具有文档,请检查其格式是否偏离OSC spec