从Julia的二进制文件中读取4字节字

问题描述 投票:6回答:3

我有一个简单的二进制文件,其中包含彼此相邻的32位浮点数。

[使用Julia,我想读取每个数字(即每个32位字),并将每个数字依次放入Float32格式的数组中。

[通过查看the documentation,我尝试了一些不同的操作,但是所有操作都产生了不可能的值(我正在使用具有已知值的二进制文件作为伪输入)。似乎:

  1. Julia一次读取一个字节的二进制文件。

  2. Julia正在将每个字节放入Uint8数组。

例如,readbytes(f, 4)给出一个无符号8位整数的4元素数组。 read(f, Float32, DIM)还会给出奇怪的值。

任何人都知道我应该如何进行吗?

file-io binaryfiles binary-data julia
3个回答
8
投票

我不确定直接将其读取为Float32的最佳方法,但是给定一个4 * nUint8s的数组,我会使用[ C0](Float32):

reinterpret

有输出:

doc link

8
投票

我发现了问题。以单精度浮点格式导入二进制数据的正确方法是raw = rand(Uint8, 4*10) # i.e. a vector of Uint8 aka bytes floats = reinterpret(Float32, raw) # now a vector of 10 Float32s ,其中julia> raw = rand(Uint8, 4*2) 8-element Array{Uint8,1}: 0xc8 0xa3 0xac 0x12 0xcd 0xa2 0xd3 0x51 julia> floats = reinterpret(Float32, raw) 2-element Array{Float32,1}: 1.08951e-27 1.13621e11 是文件流,read(f, Float32, NUM_VALS)是数据类型,f是字数(值或数据点)在二进制数据文件中。

事实证明,每次调用Float32时,数据指针都会迭代到二进制文件中的下一项。

这使人们能够简单地逐行读取数据:

NUM_VALS

但是,我想在一行代码中加载所有数据。在调试时,我多次在同一文件指针上使用read(f, [...]),而没有重新声明文件指针。结果,当我尝试正确的操作,即f = open("my_file.bin") first_item = read(f, Float32) second_item = read(f, Float32) # etc ... 时,得到了意外的值。


0
投票

Julia语言自5年前以来发生了很大变化。 read()不再具有同时指定类型和长度的API。 read(f, Float32, NUM_VALS)创建二进制数组的视图,而不是具有所需类型的数组。现在看来,执行此操作的最佳方法是预先分配所需的数组并用read()填充它:

reinterpret()

这将用所需的浮点数填充read!

© www.soinside.com 2019 - 2024. All rights reserved.