在 Julia 中以特定格式解压二进制数据

Unpack Binary Data with specific format in Julia

我正在尝试将二进制文件解析器从 Python 转换为 Julia。我正在努力弄清楚如何解压缩具有特定格式的二进制流。我发现 this discourse thread 这正是我想要做的,但它是从 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[...], readable=true, writable=false, seekable=true, append=false, size=16, maxsize=Inf, ptr=1, 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[...], readable=true, writable=false, seekable=true, append=false, size=16, maxsize=Inf, ptr=1, 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)
"[=11=][=11=][=11=]\x17@\t\x1e\xb8Q\xeb\x85\x1f"