我有一个由外部程序生成的不规则二进制文件。
文件的开头看起来像这样
"mct_terrain_material\t\xF32\xE1Ao\xAFLA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xBFFrontColor\t\xF32\xE1A\x80\xB7\xCDA\e\xFB\e@\x00\x00\x00\x00/\xA6\x7F?:^V=FrontColor\tg\x10\xECA\x80\xB7\xCDA98\x1C@\xEA\xC7\xD5=\xAA?~?:^V=FrontColor\t(\x97\fB\xC0\xDB6B\x9E\x87a@\x1C\x9CT>\a\x10z?:^V=F....."
如您所见,它有重复的模式:
在ASCII版本中,前三个元素将构成一行:
mct_terrain_material 2.814988e+01 1.279283e+01 0.000000e+00 0.000000e+00 0.000000e+00 -1.000000e+00
FrontColor 2.814988e+01 2.571460e+01 2.437201e+00 0.000000e+00 9.986295e-01 5.233596e-02
二进制版本中没有换行符。
我知道如何用一种类型解包字符串。在那种情况下,我会这样做:
binstring.unpack("F*")
我的第一个想法是使用binstring.split("\t")
然后逐个构建从第二个元素开始解压缩,但我认为应该有一个更优雅的解决方案。
有什么想法吗?
答案 0 :(得分:2)
你可以尝试一下:
while string = file.gets("\t") # separator instead of \n
binary = file.read(6*4) # or whatever size of the float is
floats = binary.unpack('F*') # or however you unpack this to array
# do whatever with string and floats
end