问题描述
我正在尝试从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"