我正在尝试用来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>'