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

Python/Simulink/MATLAB:如何在Python中正确地从Simulink读取单个类型的4字节数据?,python,python-2.7,type-conversion,simulink,data-conversion,Python,Python 2.7,Type Conversion,Simulink,Data Conversion,我在Simulink中有一个程序,可以通过TCP-IP发送一些值,并在Python 2.7中读取它们。数据作为单个值发送。Python中的代码将其读取为4个字符串作为其长度为4的32位长字符串 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

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

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上的正确数字?

使用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中可能有多个数据项

我不得不使用chr从你的问题中重新创建bytestring。如果您在x中已经有了一个bytestring,那么struct.unpact,x将完成这个任务

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

第31位:符号0=正,1=负 第30位至第23位:指数,偏置127 位22到0:数字1.f的分数f,其中。表示二进制点
哦,是的,对不起,我更正了这个问题,所以我仍然没有在收到的数据中找到含义/模式。现在如何获得正确的数据?非常感谢。它起作用了。但是如果我收到了像Hello:2.5这样的邮件呢?那会是一个像H,e,l,l,o,2.5之类的元组吗?很抱歉,这样问很简单也很愚蠢,但我的输入现在无法更改为该值,因此我无法进行测试。在这种情况下,您必须确切地知道您需要什么数据。你得到的只是一串字节。你必须事先知道它们代表什么,因为没有可靠的方法通过观察它们来判断。例如,表示浮点13.6484375的4个字节也可以是ascii字符串AZ``但只有一个反引号,很难在末尾使用空终止符正确格式化。如果执行struct.unpack,您可以看到这一点!4s,_13_65.结构.打开包装'!10s','Hello:2.5'查找长度为10的字符串将显示'Hello:2.5',。另一方面,struct.unpack'!fff'、'Hello:2.5\00\00'查找3个4字节的浮点值将得到234929.6875、5.7603133571321394E+28、4.1154635255225e-11。注意,我必须用null填充字符串到12个字节,因为unpack知道每个浮点需要4个字节。明白了!非常感谢你: