将float转换为bytearray

时间:2016-04-27 14:43:15

标签: python python-3.x

所以,我想要做的是将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?

2 个答案:

答案 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

区别仅在于可变性。 listbytearray是可变序列,而bytes类型表示不可变的字节序列。否则,bytesbytearray类型具有非常相似的API。