Java等价于struct.unpack('d',s.decode('hex'))[0]

时间:2018-02-23 22:35:52

标签: java python binaryfiles bytestring

我正在读取存储二进制文件的文件。 在python中,我可以轻松解码文件

>>> s = '0000000000A0A240'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\xa0\xa2@'
>>> import struct
>>> struct.unpack('d', s.decode('hex'))[0]
2384.0

现在我想在Java中进行相同的解码,我们有类似的东西吗?

1 个答案:

答案 0 :(得分:2)

由于这些字节是Little-Endian顺序,在Intel处理器上是C代码,因此使用ByteBuffer来帮助翻转字节:

String s = "0000000000A0A240";
double d = ByteBuffer.allocate(8)
                     .putLong(Long.parseUnsignedLong(s, 16))
                     .flip()
                     .order(ByteOrder.LITTLE_ENDIAN)
                     .getDouble();
System.out.println(d); // prints 2384.0

这里我使用Long.parseUnsignedLong(s, 16)作为快速方式为{8}字节执行decode('hex')

如果数据已经是字节数组,请执行以下操作:

byte[] b = { 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xA0, (byte) 0xA2, 0x40 };
double d = ByteBuffer.wrap(b)
                     .order(ByteOrder.LITTLE_ENDIAN)
                     .getDouble();
System.out.println(d); // prints 2384.0

上述进口是:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;