Ruby - 解压不规则的二进制字符串

标签 ruby regex binaryfiles unpack

我有一个由外部程序生成的不规则二进制文件。

文件的开头如下所示

"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....."

正如您所看到的,它有一个重复的模式:

  • 字符串(未指定长度)
  • 制表符 (\t)
  • 6 个 float
  • 重复

在 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"),然后逐个构建,从第二个元素开始解包,但我认为应该有一个更优雅的解决方案.

有什么想法吗?

最佳答案

你能尝试一下:

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

关于Ruby - 解压不规则的二进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594426/

相关文章:

io - 在 Nim 中写入/读取二进制文件

ruby-on-rails - 使用 before_save 回调或自定义验证器添加验证错误?

php - 使用 preg_match 匹配同一字符的多次出现

c - 如何使用 mpc 解析器定义标准数学符号

java - Bean 验证 API

c - 如何从图像/二进制文件中检查结构的值?

ruby - 在 Ruby 中为散列的散列指定默认值

ruby - Windows 7 - 如何解决 “You need to have Ruby and Sass installed and in your PATH for this task to work” 警告?

arrays - 使用数组键进行哈希到哈希的简单哈希

python - 关于二进制文件的一般问题