解压缩包含重复的二进制文件

时间:2013-09-04 09:08:30

标签: ruby binaryfiles

我有一个二进制文件,它存储数字作为两个无符号32位整数的重复,后跟一个无符号的8位整数。我将此文件作为字符串读取,并希望将其解码为数组数组,每个数组包含三个数字。所以我这样做:

File.open("file", "r"){|f| f.read.unpack("LLC")}

但是,这不起作用,因为它只处理文件中的前三个数字。这也行不通:

File.open("file", "r"){|f| f.read.unpack("LLC*")}

因为它将文件的其余部分解析为8位整数,并且不会创建数组数组。这不太重要,因为我可以手工完成,但我必须重复LLC模式。

1 个答案:

答案 0 :(得分:1)

请尝试以下操作:

File.open("file", "rb") { |f|
  result = []
  while true
    data = f.read(9)
    break unless data && data.length == 9
    result << data.unpack('LLC')
  end
  result
}

BTW,使用二进制模式(rb)。


ALTERNATIVE:

File.open("file", "rb") { |f|
  result = f.read.chars.each_slice(9).map { |data|
    data.join.unpack("LLC")
  }
}

"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x04\x00\x00\x00\x05\x00\x00\x00\x06".chars.each_slice(9).map { |chs| chs.join.unpack("LLC") }
# => [[1, 2, 3], [4, 5, 6]]