我有一个二进制文件,它存储数字作为两个无符号32位整数的重复,后跟一个无符号的8位整数。我将此文件作为字符串读取,并希望将其解码为数组数组,每个数组包含三个数字。所以我这样做:
File.open("file", "r"){|f| f.read.unpack("LLC")}
但是,这不起作用,因为它只处理文件中的前三个数字。这也行不通:
File.open("file", "r"){|f| f.read.unpack("LLC*")}
因为它将文件的其余部分解析为8位整数,并且不会创建数组数组。这不太重要,因为我可以手工完成,但我必须重复LLC模式。
答案 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]]