在Python中准备一个非常简单的64位浮点数列表,并用Gfortran编写为无格式,这容易吗?

2024-10-03 17:17:32 发布

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

我用以下代码编写了这个非常简单的5个数字的列表,这些代码是在64位Linux机器上用gfortran编译的:

integer, parameter :: binary64  = selected_real_kind(15, 307)
real(kind=binary64) :: zero, one, pi
zero = 0.0_binary64
one  = 1.0_binary64
pi   = 3.141592653589793238_binary64
open(unit=10, file="test", action="write", status="new", form="unformatted")
write(unit=10) zero
write(unit=10) one
write(unit=10) pi
write(unit=10) zero
write(unit=10) one
close(unit=10)

我可以通过以下方式读取十六进制文件:

xxd short.test.file_binary64

这就是输出:

0000000: 0800 0000 0000 0000 0000 0000 0800 0000  ................
0000010: 0800 0000 0000 0000 0000 f03f 0800 0000  ...........?....
0000020: 0800 0000 182d 4454 fb21 0940 0800 0000  .....-DT.!.@....
0000030: 0800 0000 0000 0000 0000 0000 0800 0000  ................
0000040: 0800 0000 0000 0000 0000 f03f 0800 0000  ...........?....

所以每个寄存器都有一个数字:0,10,20,30,40。我不确定其他事物的哪个部分对应于0,1,pi,1,1,以及0800 000的含义,我也不知道其他事物是什么(ascii中的失败表示?)你知道吗

如果我进行二进制读取:

xxd -b short.test.file_binary64

输出更加神秘:

0000000: 00001000 00000000 00000000 00000000 00000000 00000000  ......
0000006: 00000000 00000000 00000000 00000000 00000000 00000000  ......
000000c: 00001000 00000000 00000000 00000000 00001000 00000000  ......
0000012: 00000000 00000000 00000000 00000000 00000000 00000000  ......
0000018: 00000000 00000000 11110000 00111111 00001000 00000000  ...?..
000001e: 00000000 00000000 00001000 00000000 00000000 00000000  ......
0000024: 00011000 00101101 01000100 01010100 11111011 00100001  .-DT.!
000002a: 00001001 01000000 00001000 00000000 00000000 00000000  .@....
0000030: 00001000 00000000 00000000 00000000 00000000 00000000  ......
0000036: 00000000 00000000 00000000 00000000 00000000 00000000  ......
000003c: 00001000 00000000 00000000 00000000 00001000 00000000  ......
0000042: 00000000 00000000 00000000 00000000 00000000 00000000  ......
0000048: 00000000 00000000 11110000 00111111 00001000 00000000  ...?..
000004e: 00000000 00000000  

我需要用Python读取这些数据。因此,我提出了三个问题,我认为第一个问题非常简单:

  1. 这个问题简单明了吗?在做了大量的研究之后,我还需要了解一些信息吗?

  2. 这是一个相当复杂的问题,因为二进制文件依赖于cpu和编译器bla,我可能会花一个星期的时间在internet上做研究,但仍然无法解决它?

  3. 如何读取Python中的数据?


Tags: 文件代码testpiunit数字onereal
1条回答
网友
1楼 · 发布于 2024-10-03 17:17:32

每个数据集的格式为32位整数长度、64位双精度值、32位整数长度。你知道吗

你可以用struct解码,例如第三个数据集

import struct
data = b'\x08\x00\x00\x00\x18-DT\xfb!\t@\x08\x00\x00\x00'
l1, value, l2 = struct.unpack("<idi", data)
# (8, 3.141592653589793, 8)

因此,您需要以16字节为单位读取文件:

with open("short.test.file_binary64", "rb") as binary:
    while True:
        data = binary.read(16)
        if not data:
            break
        l1, value, l2 = struct.unpack("<idi", data)
        print(value)

相关问题 更多 >