我正在尝试打开一个二进制文件,我对其内部结构有一些了解,并在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
作为功能,但无济于事。
你可以使用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
时,你应该确定它是否应该被编码为big-endian或little-endian(参见ENDIAN_BOM
constant和ntoh
,hton
,ltoh
,htol
函数)
这里是。使用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