如何在python中将字节数组转换为双精度数?

use*_*316 4 python java double byte

我正在使用 Java 将双精度转换为字节数组。像这样:

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

现在,我想将此字节数组转换回双精度。在 Java 中,我会这样做:

public static double toDouble(byte[] bytes) {
    return ByteBuffer.wrap(bytes).getDouble();
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 8

Python 具有将字节转换回值的struct模块float

import struct

value = struct.unpack('d', bytes)[0]
Run Code Online (Sandbox Code Playgroud)

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

另一种选择是将您的bytes价值变成一个array对象;如果你有一个同构的双打序列,你会使用这个:

import array

doubles_sequence = array.array('d', bytes)
Run Code Online (Sandbox Code Playgroud)

其中每 8 个字节被解释为一个双doubles_sequence精度值,形成一个双精度序列,可通过索引寻址。要支持不同的字节序,您可以将字节顺序与doubles_sequence.byteswap().


aba*_*ert 5

您想要的struct模块:

\n\n
>>> d = 1.234\n>>> b = struct.pack(\'d\', d)\n>>> b\nb\'X9\\xb4\\xc8v\\xbe\\xf3?\'\n>>> d2, = struct.unpack(\'d\', b)\n>>> d2\n1.234\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

另请注意,\xe2\x80\x94 在 Java 和 Python 中\xe2\x80\x94,您可能经常希望指定显式字节序,特别是如果您计划将字节保存到文件或将它们发送出去网络。有关详细信息,请参阅格式字符串

\n\n

所以:

\n\n
>>> b = bytearray(struct.pack(\'!d\', d))\n>>> b\nbytearray(b\'?\\xf3\\xbev\\xc8\\xb49X\')\n>>> b[0]\n63\n
Run Code Online (Sandbox Code Playgroud)\n