所以,我想要做的是将float转换为bytearray,但我继续接收无输入,并且EXTREME减慢/冻结我的计算机。 我的代码是
import struct
def float_to_hex(f):
return hex(struct.unpack('<I', struct.pack('<f', f))[0])
value = 5.1 #example value
...
value = bytearray(int(float_to_hex(float(value)), 16)
我在另一篇文章中找到了一个将浮点数转换为十六进制的函数
def float_to_hex(f):
return hex(struct.unpack('<I', struct.pack('<f', f))[0])
然后我将它从十六进制转换为int。 这有什么问题?我怎样才能更好地将它从float转换为bin或bytearray?
答案 0 :(得分:10)
这取决于你想要什么,以及你将要做什么。如果你想要的只是一个bytearray:
import struct
value = 5.1
ba = bytearray(struct.pack("f", value))
ba
是一个bytearray。但是,如果您希望显示十六进制值(我怀疑),那么:
print([ "0x%02x" % b for b in ba ])
修改:
这给出(对于值5.1):
['0x33', '0x33', '0xa3', '0x40']
然而,CPython使用C类型double
来存储甚至小浮点数(这有很好的理由),所以:
value = 5.1
ba = bytearray(struct.pack("d", value))
print([ "0x%02x" % b for b in ba ])
给出:
['0x66', '0x66', '0x66', '0x66', '0x66', '0x66', '0x14', '0x40']
答案 1 :(得分:0)
我想要的5.1结果是0x40 a3 33 33或64 163 51 51.不是字符串。
从float中获取所需的整数列表:
>>> import struct
>>> list(struct.pack("!f", 5.1))
[64, 163, 51, 51]
或与bytearray
类型相同:
>>> bytearray(struct.pack("!f", 5.1))
bytearray(b'@\xa333')
注意:bytestring(bytes
type)包含完全相同的字节:
>>> struct.pack("!f", 5.1)
b'@\xa333'
>>> for byte in struct.pack("!f", 5.1):
... print(byte)
...
64
163
51
51
区别仅在于可变性。 list
,bytearray
是可变序列,而bytes
类型表示不可变的字节序列。否则,bytes
和bytearray
类型具有非常相似的API。