【问题标题】:Parse array of unsigned integers in Julia 1.x.x在 Julia 1.x.x 中解析无符号整数数组
【发布时间】:2019-08-11 18:08:51
【问题描述】:

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

arx=open("../axonbinaryfile.abf", "r")  
databin=read(arx)  
close(arx)

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

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

4-element Array{Char,1}:
 'A'
 'B'
 'F'
 ' '

那么恰好在位置 13-16 中是一个等待解释的 32 字节整数。我该怎么做? 我曾尝试将reinterpret()Int32 作为函数,但无济于事。

【问题讨论】:

标签: parsing julia binaryfiles


【解决方案1】:

您可以使用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)

编辑还有一条评论是,当您转换为 4 个字节的 Int32 时,您应该确保检查它是否应该被编码为大端或小端(参见 @ 987654331@常量和ntohhtonltohhtol函数)

【讨论】:

  • 看来read 做得很好。现在我有另一个问题。它无法读取 Int16 的数组,即使 isa(Array{Int16,1}, Type) 告诉我它是有效类型。
  • 它不起作用,因为Vector{Int16} 没有定义的大小。方法read(io, T) 只处理有限的一组类型T(确实,这里的文档可能更精确)。你可以做两件事。可以根据需要多次重复阅读Int16,或者使用推荐的其他方法阅读Vector{UInt8},然后使用reinterpret(Int16, data_read_in) 获得Vector{Int16}
  • 这是一个特殊情况,通常需要从源获取所有数据作为字符串。
【解决方案2】:

来了。使用view 避免复制数据。

julia> dat = UInt8[65,66,67,68,0,0,2,40];

julia> Char.(view(dat,1:4))
4-element Array{Char,1}:
 'A'
 'B'
 'C'
 'D'

julia> reinterpret(Int32, view(dat,5:8))
1-element reinterpret(Int32, view(::Array{UInt8,1}, 5:8)):
 671219712

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2020-05-16
    相关资源
    最近更新 更多