在Julia中解压缩具有特定格式的二进制数据

问题描述

我正在尝试从Python将Binary文件解析器转换为Julia。我正在努力找出如何以特定格式解压缩二进制流。我发现this话语线程正是我要尝试做的,但是从2017年开始,似乎没有可行的解决方案。有人有解决方案吗?

在Python中,它看起来像这样:

In [22]: struct.unpack('>idi',b'\x00\x00\x00\x17@\t\x1e\xb8Q\xeb\x85\x1f\x00\x00\x00*')
Out[22]: (23,3.14,42)

在朱莉娅,我在这里

data = open(filename,"r")
seek(data,0)
# Now I want to get the first 12 bytes of the file and convert to a string.. and am stumped.. 

解决方法

我对Python中的struct.unpack不太熟悉,但是也许您可以执行以下操作:

julia> data = IOBuffer("\x00\x00\x00\x17@\t\x1e\xb8Q\xeb\x85\x1f\x00\x00\x00*")
IOBuffer(data=UInt8[...],readable=true,writable=false,seekable=true,append=false,size=16,maxsize=Inf,ptr=1,mark=-1)

julia> seekstart(data)
IOBuffer(data=UInt8[...],mark=-1)

julia> i  = bswap(read(data,Int32))
23

julia> pi = bswap(read(data,Float64))
3.14

julia> i  = bswap(read(data,Int32))
42

bswap之所以存在,是因为Julia内部使用的内容与二进制流中编码的内容之间的字节序关系似乎有所不同。除此之外,这只是read的简单用法,用于指定要读取的数据类型。

顺便说一下,这是读取文件的前12个字节并将其转换为字符串的方法(在这种情况下,这不是必需的,但在其他情况下可能有用):

julia> seekstart(data)
IOBuffer(data=UInt8[...],mark=-1)

julia> bytes = read(data,12)
12-element Array{UInt8,1}:
 0x00
 0x00
 0x00
 0x17
 0x40
 0x09
 0x1e
 0xb8
 0x51
 0xeb
 0x85
 0x1f

# note the capital "S" in "String"
julia> String(bytes)
"\0\0\0\x17@\t\x1e\xb8Q\xeb\x85\x1f"