解析 Julia 1.xx 中的无符号整数数组

wpk*_*kzz 3 parsing binaryfiles julia

我试图打开一个我对其内部结构有一些了解的二进制文件,并在 Julia 中正确地重新解释它。假设我可以通过以下方式加载它:

arx=open("../axonbinaryfile.abf", "r")  
databin=read(arx)  
close(arx)
Run Code Online (Sandbox Code Playgroud)

数据作为 UInt8 数组加载,我猜是字节。在前 4 个中,我可以执行一个简单的Char转换并且它有效:

head=databin[1:4]
map(Char, head)

4-element Array{Char,1}:
 'A'
 'B'
 'F'
 ' '
Run Code Online (Sandbox Code Playgroud)

然后碰巧在位置 13-16 是一个等待解释的 32 个字节的整数。我该怎么做?我试过reinterpret()Int32作为功​​能,但无济于事。

Bog*_*ski 5

您可以使用reinterpret(Int32, databin[13:16])[1]. 最后一个[1]是必需的,因为reinterpret返回给你一个视图。

现在注意read支持类型传递。因此,如果您首先从文件中读取 12 个字节的数据,例如这样read(arx, 12),然后运行,read(arx, Int32)您将获得所需的数字,而无需进行任何转换或向量分配。

最后观察一下Char在你的代码中执行的转换是将一个 Unicode 数字转换为一个字符。我不确定这是否正是您想要的(也许是)。例如,如果读入的第一个字节具有值,200您将获得:

julia> Char(200)
'È': Unicode U+00c8 (category Lu: Letter, uppercase)
Run Code Online (Sandbox Code Playgroud)

编辑另一条评论是,当您转换为Int324 个字节时,您应该确保检查它是否应该编码为大端或小端(请参阅ENDIAN_BOM常量和ntoh, hton, ltoh,htol函数)

  • 它不会工作,因为 `Vector{Int16}` 没有定义的大小。`read(io, T)` 方法只处理一组有限的类型 `T`(确实,这里的文档可以更精确)。你可以做两件事。可以根据需要多次重复读取 `Int16`,或者使用推荐的其他方法读取 `Vector{UInt8}`,然后通过 `reinterpret(Int16, data_read_in)` 获得 `Vector{Int16}`。 (2认同)