1

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

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

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

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

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

4

1 回答 1

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
}

顺便说一句,使用二进制模式 ( rb)。


选择:

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]]
于 2013-09-04T09:13:19.037 回答