代码之家  ›  专栏  ›  技术社区  ›  Haroon

Python/Simulink/MATLAB:如何在Python中正确读取Simulink中的单类型4字节数据?

  •  0
  • Haroon  · 技术社区  · 6 年前

    我在Simulink中有一个程序,可以通过TCP-IP发送一些值,并在Python 2.7中读取它们。数据作为“单个”值发送。Python中的代码将其读取为4个字符串,其长度为32位(长度为4的字符串)。

    print "x0:", ord(data[0])
    print "x1:", ord(data[1])
    print "x2:", ord(data[2])
    print "x3:", ord(data[3])
    

    问题是,我在Python中得到的值与发送的值不同。

    0.125 is read as x0: 62, x1: 0, x2: 0, x3: 0
    13.65 is read as x0:65, x1=90, x2: 96, x3: 0
    51.79 is read as x0:66, x1=79, x2: 42, x3: 128
    113.4 is read as x0:66, x1=226, x2: 200, x3: 220
    

    那么如何获取这些值。。。0.125, 13.65, 51.79, 113.4, ... 作为接收端的正确数字(Python)?

    1 回复  |  直到 6 年前
        1
  •  1
  •   BoarGules    6 年前

    使用 struct 要解压缩正在脱离连接的4字节浮点。

    >>> import struct
    >>> patt='!f'    # big-endian single-precision float, 4 bytes
    >>> _0_125 = chr(62)+chr(0)+chr(0)+chr(0)
    >>> struct.unpack(patt,_0_125)
    (0.125,)   
    >>> _13_65 = chr(65)+chr(90)+chr(96)+chr(0)
    >>> struct.unpack(patt,_13_65)
    (13.6484375,) 
    >>> _51_79 = chr(66)+chr(79)+chr(42)+chr(128)
    >>> struct.unpack(patt,_51_79)
    (51.79150390625,)
    

    这将返回一个元组,因为在传递给的bytestring中可能有多个数据项 unpack .

    我不得不使用 chr() . 如果您已经在 x 然后 struct.unpack(patt,x) 会成功的。

    您以字节形式看到的数据似乎与您期望的值无关,因为它是IEEE754格式的。数据是二进制的,字节边界没有意义:

    • 第31位: 符号(0=正,1=负)
    • 位30至23: 指数,偏差127
    • 位22至0: 小部分 f 数字1的。 f (其中 . 表示二进制点)