I don’t have some test data to be certain, but perhaps this could work:
struct Data{T}
x::T
y::T
z::T
pdf::T
end
function read_file(path; coordinate_conversion=nothing)
data = Data{Float32}[]
open(path, "r") do io
# buffer of raw bytes for each item of data
buffer = Vector{UInt8}(undef, sizeof(Data{Float32}))
while !eof(io)
readbytes!(io, buffer)
push!(data, (reinterpret(Data{Float32}, buffer)[1]))
end
end
data = @views data[5:end]
if !isnothing(coordinate_conversion)
data .= coordinate_conversion.(data) # convert in-place
end
return data
end
I believe reinterpret
is little endian for the most part (see this post).
This isn’t the most performant implementation as it keeps resizing the array, but it should get you part of the way there.