在 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"
我正在尝试将二进制文件解析器从 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"