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

时间:2019-03-20 22:27:18

标签: parsing julia binaryfiles

我正在尝试打开一个我对其内部结构有一定了解的二进制文件,并在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用作函数,但无济于事。

2 个答案:

答案 0 :(得分:3)

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

EDIT 还有一个评论是,当您将4字节转换为Int32时,应确保检查是否应将其编码为big-endian或little-endian(参见ENDIAN_BOM常量和ntohhtonltohhtol函数)

答案 1 :(得分: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