gpt4 book ai didi

python - 在 Python 中准备一个非常简单的 64 位 float 列表,用 Gfortran 编写为 UNFORMATTED 是否容易?

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:19 27 4
gpt4 key购买 nike

我使用以下代码编写了这个非常简单的 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 和编译器 blablabla,我可能会花一周时间围绕互联网进行研究,但仍然无法解决问题?

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

最佳答案

格式为32位整数长度,64位 double 值,每个数据集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)

关于python - 在 Python 中准备一个非常简单的 64 位 float 列表,用 Gfortran 编写为 UNFORMATTED 是否容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43640172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com