pro*_*mar 3 python byte casting
我是Python语言的新手,我很难做一些我可以很容易地用C++或Java做的事情,但由于某些原因,在Python中看起来很复杂.我在数组中有以下四个字节(以大端顺序):
[0x64, 0xD8, 0x6E, 0x3F]
Run Code Online (Sandbox Code Playgroud)
我事先已经知道这些字节代表什么.它们指定以下32位浮点数:0.932989
我需要使用Python执行哪些步骤(最好是v3.2.1并且不使用额外的导入)将这4个字节解释为float并将该数字存储在一个我可以作为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
Run Code Online (Sandbox Code Playgroud)
y对这些字节有正确的预期整数解释,1064228964也就是说,当将其转换为32位时会出现问题float.它不是将原始字节y作为float转换,而是转换这些字节的整数表示,因此z包含1064228964.0而不是所需的值0.932989.是否有可能int.from_bytes用于执行此简单任务的东西?也许是这样的float.from_bytes?
详细信息请参阅Python Struct.针对您的具体问题:
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)
?
Run Code Online (Sandbox Code Playgroud)
输出:
(0.8939268589019775,)
(3.193376169798871e+22,)
(0.9329893589019775,)
Run Code Online (Sandbox Code Playgroud)
如果您愿意使用真正能够有效处理(大型)数字数组的大型库:
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)
Run Code Online (Sandbox Code Playgroud)
这也适用于大字节数组;然后你会得到一个浮点数数组。
| 归档时间: |
|
| 查看次数: |
8878 次 |
| 最近记录: |