如何使用Python将4字节解释为32位浮点 我是Python语言的新手,我很难用C++或java做一些简单的事情,但是由于某些原因,在Python中似乎很复杂。我在一个数组中有以下四个字节(按大端顺序):

如何使用Python将4字节解释为32位浮点 我是Python语言的新手,我很难用C++或java做一些简单的事情,但是由于某些原因,在Python中似乎很复杂。我在一个数组中有以下四个字节(按大端顺序):,python,casting,byte,Python,Casting,Byte,我事先已经知道这些字节代表什么。它们指定以下32位浮点数:0.932989 我需要使用Python(最好是v3.2.1,不使用额外的导入)执行哪些步骤来将这4个字节解释为该浮点值,并将该数字存储在一个可以作为32位浮点值操作的变量中?也就是说,我可以将其用作以下变量myVar=0.932989 我试过: x = [0x64, 0xd8, 0x6e, 0x3f] y = int.from_bytes(x, byteorder='little', signed=False) #interpret b

我事先已经知道这些字节代表什么。它们指定以下32位浮点数:
0.932989

我需要使用Python(最好是v3.2.1,不使用额外的导入)执行哪些步骤来将这4个字节解释为该浮点值,并将该数字存储在一个可以作为32位浮点值操作的变量中?也就是说,我可以将其用作以下变量
myVar=0.932989

我试过:

x = [0x64, 0xd8, 0x6e, 0x3f]
y = int.from_bytes(x, byteorder='little', signed=False) #interpret bytes as an unsigned little-endian integer (so far so good)
z = float(y) #attempt to cast as float reinterprets integer value rather than its byte values
y
对这些字节具有正确的预期整数解释,即
1064228964
,将其转换为32位
浮点时会出现问题。它不会将
y
的原始字节强制转换为浮点数,而是强制转换这些字节的整数表示形式,因此
z
包含
1064228964.0
而不是所需的
0.932989
值。是否有一些等效于
int.from_bytes
的东西可以用来执行这个简单的任务?可能类似于float.from_bytes

的内容,有关详细信息,请参阅。关于你的具体问题:

import struct

# if input is string, per @robyschek will fail on python 3
data=b'\x64\xd8\x64\x3f'  
print struct.unpack('<f', data)   #little endian
print struct.unpack('>f', data)   # big endian

#your input  
list1=[0x64, 0xD8, 0x6E, 0x3F]
# aa=str(bytearray(list1))  # edit: this conversion wasn't needed
aa= bytearray(list1) 
print struct.unpack('<f', aa)
​

如果您愿意使用真正用于高效处理(大型)数字数组的大型库:

import numpy as np
data_bytes = np.array([0x64, 0xD8, 0x6E, 0x3F], dtype=np.uint8)
data_as_float = data_bytes.view(dtype=np.float32)
print(data_as_float)

这也适用于大字节数组;然后你会得到一个浮点数组。

看看“struct”模块。
unpack
在ByteArray上工作,因此无需强制转换到
str
,甚至在py3上,unpack不接受
str
,并且将fail@robyschek:Ty,想给出字符串答案,因为这很常见。py3上指针的Ty。由于某种原因,我得到了
aa=“bytearray(b'd\\xd8n?”)”
。有办法解决这个问题吗?是的。我键入
list1=[0x64,0xD8,0x6E,0x3F]
然后键入
aa=str(bytearray(list1))
,然后键入
aa
查看其内容,python的答案是
“bytearray(b'd\\xd8n?)”
。请查看我的编辑。您不需要aa=str(…)部分,只需传递bytelist就可以了,您的错误发生在Python3中,这就是为什么我没有注意到它(这里是Python2.7)。
(0.8939268589019775,)
(3.193376169798871e+22,)
(0.9329893589019775,)
import numpy as np
data_bytes = np.array([0x64, 0xD8, 0x6E, 0x3F], dtype=np.uint8)
data_as_float = data_bytes.view(dtype=np.float32)
print(data_as_float)