如何在 Julia 中读取具有特定字节大小(32 位)值的二进制文件?

How to read a binary file with a specific bytesize (32bit) values in Julia?

我正在尝试开始使用 Julia,并决定重写我在 Python 中编写的一个小程序,该程序运行时间太长。

我的第一个障碍是关于如何读取我写的一些二进制数据。

我有一个文件(gzip 压缩,虽然我认为它是一样的)用 "rows" 中的 6 个 Float32 数字的制表符二进制数据编写。

我找到了逐行读取6个数字的方法,但我不知道如何结束读取(如何使用EOF with read?)我也认为只读取会更好立即归档,而不是每次都输入 6 个值。

using GZip
dataFile = GZip.open("ACE_ions_fieldrotation.bin.gz", "r")
read(dataFile, Float32, 6)
# tried also this but it doesn't work, besides not allowing me to specify that I'm reading Float32 numbers:
# readuntil(dataFile, eof)
# it fails with the error: `read` has no method matching read(::GZipStream, ::Type{Function})
close(dataFile)

那么,我该如何着手完成这项任务呢?有什么想法吗?

编辑:

这些是使用 hexdump 的 GZip 文件的前 128 个字节,以防有帮助。

0000000 1f 8b 08 08 0b 87 a1 54 02 ff 41 43 45 5f 69 6f
0000010 6e 73 5f 66 69 65 6c 64 72 6f 74 61 74 69 6f 6e
0000020 2e 62 69 6e 00 7c bd 75 58 97 dd d2 3d ae 22 25
0000030 dd dd dd dd 21 31 84 48 29 88 d8 18 28 16 22 62
0000040 8b 81 88 1d 80 85 8a 2d 06 28 26 d8 8d 22 26 60
0000050 2b d8 20 76 b7 f2 f5 3c bf df 79 df eb bc b3 f6
0000060 79 fe 7b c6 7d cd bd ef bd 67 af 59 b3 f6 dc 1f
0000070 da c4 87 46 ac bc 61 4a 23 e6 6a 53 9b bf ff c9
0000080

x = readuntil(dataFile, '\n')
y = reinterpret(Float32, x.data[1:end-1])

为你工作?

我找到了答案,所以我会 post 放在这里以供将来参考。

我们应该使用readbytes函数,读取字节变得非常简单。在使用 reshapetranspose 之后(有什么方法可以让 reshape 立即正确地放置它而不必执行 transpose?)我们得到了具有正确维度的数组.

using GZip
simDataFile = GZip.open("ACE_ions_fieldrotation.bin.gz", "r")
simData = reinterpret(Float32,readbytes(simDataFile))
close(simDataFile)
simArray = transpose(reshape(simData, 6, div(length(simData),6)))