【发布时间】:2019-06-12 05:05:42
【问题描述】:
我正在尝试使用unpack 来解码二进制文件。二进制文件结构如下:
ABCDEF\tFFFABCDEF\tFFFF....
在哪里
ABCDEF -> String of fixed length
\t -> tab character
FFF -> 3 Floats
.... -> repeat thousands of times
当类型都相同或只有数字和固定长度的数组时,我知道该怎么做,但我在这种情况下很挣扎。例如,如果我有一个浮动列表,我会这样做
s.unpack('F*')
或者如果我有整数和浮点数,比如
[1, 3.4, 5.2, 4, 2.3, 7.8]
我愿意
s.unpack('CF2CF2')
但在这种情况下,我有点迷茫。我希望使用带括号的格式字符串,例如 `(CF2)*',但它不起作用。
如果这很重要,我需要使用 Ruby 2.0.0-p247
示例
ary = ["ABCDEF\t", 3.4, 5.6, 9.1, "FEDCBA\t", 2.5, 8.9, 3.1]
s = ary.pack('P7fffP7fff')
然后
s.scan(/.{19}/)
["\xA8lf\xF9\xD4\x7F\x00\x00\x9A\x99Y@33\xB3@\x9A\x99\x11", "A\x80lf\xF9\xD4\x7F\x00\x00\x00\x00 @ff\x0EAff"]
终于
s.scan(/.{19}/).map{ |item| item.unpack('P7fff') }
Error: #<ArgumentError: no associated pointer>
<main>:in `unpack'
<main>:in `block in <main>'
<main>:in `map'
<main>:in `<main>'
【问题讨论】:
-
P7是问题所在,请尝试将p更改为小写(第 7 位)。打包/拆包时存在一些差异。读取文件时,您使用P7,因为它不是空终止符,但再次打包时,它是。我只是通过使用P7fffP7fff打包并使用pfffpfff解包来正确使用示例。 -
我得到同样的错误
-
您的示例使用了一个数组,其中每个项目已经分开,因此您将使用较低的
p。读取文件时,它将是一串字节,没有被分隔成数组项,因此您必须使用大写变体P7指定固定长度。 -
好的。我今晚回家后会尝试访问该文件。
-
@ForeverZer0:
p和P都是问题。
标签: ruby binaryfiles binary-data pack unpack