【问题标题】:How to decode / encode decimal values in python?如何在python中解码/编码十进制值?
【发布时间】:2014-09-30 21:51:02
【问题描述】:

我正在使用网络协议通过网络来回传输 OSC(开放式声音控制消息)。

消息以byte array 以及其他格式接收。我正在尝试理解它的字节数组部分。

一个示例消息,在 ascii 中是

/track_0_volume/x "value" 0.238

该消息对应的字节数组是

b'/track_0_volume/x\x00\x00\x00,sf\x00value\x00\x00\x00>s\xb6F'

我可以看到字节数组有/track_0_volume/x后跟三个空字符,然后是ascii值sf,一个空字符value再三个空字符然后>s\xb6F我不明白sf 字符是什么,末尾的 >s\xb6F 代表 0.238

我相信,(我对 OSC 消息格式不太熟悉)s 表示单词 value 是字符串类型(而不是 intfloat)和下一个值是float(即value.238

对我来说最令人困惑的部分是最后的小数部分:当我尝试解码字节数组的那部分时,我得到一个UnicodeDecodeError: 'utf-8 can't decode byte 0xb6

我也使用了struct.unpack('f', b'\b6F'),但没有成功。有人知道如何解码吗?

【问题讨论】:

    标签: python osc


    【解决方案1】:

    根据the documentation,浮点数是32位,大端。

    >>> struct.unpack('>f', '>s\xb6F')[0]
    0.23800000548362732
    

    此外,所有字符串都以零字节结尾,再加上最多 3 个零字节以使长度成为 4 的倍数。这解释了您拥有的所有 \x00;浮点数前面有 3 个字符串。

    附:我的例子是 Python 2.7,你的似乎是 Python 3。相应地调整。

    【讨论】:

    • 辉煌的马克。这次真是万分感谢。你介意解释一下为什么最后需要[0]吗?
    • @Startec, unpack 返回一个元组,但你知道它只会包含一个值,所以它只是对第一个值进行切片。
    • 最后一个问题:那么,如果原始字节数组有两个字符串,(如果它说 track_0_volume/xextra 字节数组将改为阅读 b'/track_0_volume/x\x00\x00\x00,ssf...可以解码一组可变长度的浮点数、整数或字符串?即,有时可能只有一个 f,有时可能有两个?这很难,因为似乎有不同数量的 null 字节根据字符串长度添加......
    • 在我的问题中,有一个逗号来分隔“地址”track_0_volume,但以下参数没有这样的东西。此外,不同数量的空值让我很难弄清楚如何解码。
    • @Startec 跟踪每个片段在主字节数组中的起始位置及其长度。如果是字符串,将长度四舍五入为4的倍数。知道字符串长度的方法是搜索其中的第一个\x00
    猜你喜欢
    • 2012-07-25
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多