在python中,如何将字节数组转换为double?

2024-04-29 14:32:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Java将double转换为字节数组。像这样:

public static byte[] toByteArray(double value) {
    byte[] bytes = new byte[8];
    ByteBuffer.wrap(bytes).putDouble(value);
    return bytes;
}

现在,我想把这个字节数组转换回一个double。在Java中,我会这样做:

public static double toDouble(byte[] bytes) {
    return ByteBuffer.wrap(bytes).getDouble();
}

现在,我如何用Python编写toDouble()方法?


Tags: newreturn字节bytesvaluestatic数组java
2条回答

Python有^{} module将字节转换回float值:

import struct

value = struct.unpack('d', bytes)[0]

这里'd'表示需要一个双精度值(在本机endianess中,为8字节)。有关更多选项,包括指定endianess,请参阅模块文档。

另一种选择是将bytes值转换为^{} object;如果您有一个相同的双倍序列,则可以使用此选项:

import array

doubles_sequence = array.array('d', bytes)

其中每8个字节被解释为一个双精度值,使doubles_sequence成为一个双精度序列,可通过索引寻址。为了支持不同的endianess,可以用doubles_sequence.byteswap()交换字节顺序。

您需要^{}模块:

>>> d = 1.234
>>> b = struct.pack('d', d)
>>> b
b'X9\xb4\xc8v\xbe\xf3?'
>>> d2, = struct.unpack('d', b)
>>> d2
1.234

pack方法在Python 3.x中为您提供一个bytes,在Python 2.x中为您提供一个str。这种类型不像Java byte[]那样是可变的,在2.x中,它还像一个单字符串序列,而不是0-255之间的数字序列。如果需要修复其中任何一个,只需将其转换为bytearray

另外,请注意,在Java和Python中,您可能希望更经常地指定显式的endianness,特别是当您计划将字节保存到文件或通过网络发送它们时。有关详细信息,请参见Format Strings

所以:

>>> b = bytearray(struct.pack('!d', d))
>>> b
bytearray(b'?\xf3\xbev\xc8\xb49X')
>>> b[0]
63

相关问题 更多 >