【问题标题】:Unpack Binary Data with specific format in Julia在 Julia 中以特定格式解压缩二进制数据
【发布时间】:2020-10-28 18:53:40
【问题描述】:

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

在 Julia 我在这里:

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.. 

【问题讨论】:

标签: julia binaryfiles binary-data


【解决方案1】:

我对 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

bswaps 之所以存在,是因为 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)
"\0\0\0\x17@\t\x1e\xb8Q\xeb\x85\x1f"

【讨论】:

  • 谢谢!是的,我刚刚想通了..这是我第一次尝试二进制解析器,只是花了一点时间让它渗入我厚厚的脑袋..
猜你喜欢
  • 2010-09-17
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多