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

Posted

技术标签:

【中文标题】Ruby - 解压不规则的二进制字符串【英文标题】:Ruby - Unpack irregular binary string 【发布时间】:2016-06-02 14:14:35 【问题描述】:

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

文件的开头是这样的

"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 个浮点数 重复

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

有什么想法吗?

【问题讨论】:

\t 进行拆分不会起作用,因为它可能在二进制数据中也能找到。 我没想到。还好我没试过! 你想要 infine 那种 ascii 格式? 【参考方案1】:

您可以尝试以下方式:

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 - 解压不规则的二进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中将字符串或整数转换为二进制?

如何在 Ruby 中将字符串或整数转换为二进制?

Ruby二进制字符串转换

如何将 64 位二进制字符串转换为 ruby​​ 中的双浮点数?

如何验证字符串是 Ruby 中正确的十六进制值?

在 Ruby 中将整数转换为十六进制字符串