【问题标题】:How to read .bin files?如何读取 .bin 文件?
【发布时间】:2009-11-08 11:59:34
【问题描述】:

我从 RealFlow 4 导出了一个 .bin 文件,现在需要能够在 Python 中读取它,以创建一个导入器。这些文件是如何工作的?

【问题讨论】:

  • 我同意 jldupont 的观点。此外,它看起来像一个重复(我想你不是要编写整个解析器?):stackoverflow.com/questions/1035340/…
  • 来吧,标记一些已接受的答案...
  • 对不起,我不知道我必须这样做。
  • 感谢 RedGlyph 我设法读取了文件,但现在我有一个包含所有内容的长字符串,它由 /xNN 字符组成,有时还有一些单词。这是一小块 '\xda\xba\xfa\x00Square01\x00lflow.bin\x00\x0001\x9bs\x84\x86\x9dsp\x86\x9dsh\xea\xef\x08\xc8\xad\xd4\t\x00\ x01\x00\x00h\xea\xef\x08\xe0+\x9bsA1\x9bs\xc8\xad\xd4\t\xab' 现在,在这些字符中我确定有粒子的 x y z 坐标,但我没有如何让它们脱离“代码”的最小线索。
  • RealFlow .bin 文件似乎没有被广泛记录。我在某处发现:“BIN 文件格式规范由 Next Limit 以 PDF 格式提供,作为 RealFlow 应用程序的一部分(包含在评估版中)。如果您需要规范,请下载 RealFlow 的评估版或购买完整产品。”如果您在某个地方有规范,我们可以帮助您对其进行 Python 解释。

标签: python file binary


【解决方案1】:

给你:

import struct

class Particle:
    """A single particle.  Attributes added in BinFile."""
    pass

class BinFile:
    """Parse and store the contents of a RealFlow .bin file."""
    def __init__(self, fname):
        self.bindata = open(fname, "rb").read()
        self.off = 0

        self.verify = self.peel("=i")[0]
        assert self.verify == 0xfabada
        self.name = self.string(250)

        (self.version, self.scale, self.fluid_type, self.simtime, self.frame_number,
         self.fps, self.num_particles, self.radius) = self.peel("=hfifiiif")
        self.pressure = self.peel("=fff")
        self.speed = self.peel("=fff")
        self.temperature = self.peel("=fff")
        if self.version >= 7:
            self.emitter_position = self.peel("=fff")
            self.emitter_rotation = self.peel("=fff")
            self.emitter_scale = self.peel("=fff")

        self.particles = [self.peel_particle() for i in range(self.num_particles)]

    def peel_particle(self):
        """Read one particle from the file."""
        p = Particle()
        p.position = self.peel("=fff")
        p.velocity = self.peel("=fff")
        p.force = self.peel("=fff")
        if self.version >= 9:
            p.vorticity = self.peel("=fff")
        if self.version >= 3:
            p.normal = self.peel("=fff")
        if self.version >= 4:
            p.neighbors = self.peel("=i")[0]
        if self.version >= 5:
            p.texture = self.peel("=fff")
            p.infobits = self.peel("=h")[0]
        (p.age, p.isolation_time, p.viscosity, p.density, p.pressure, p.mass,
         p.temperature, p.id) = self.peel("=fffffffi")
        print p.id, p.neighbors, p.position
        return p

    def peel(self, fmt):
        """Read some struct data from `self.bindata`."""
        data = struct.unpack_from(fmt, self.bindata, self.off)
        self.off += struct.calcsize(fmt)
        return data

    def string(self, length):
        s = self.bindata[self.off:self.off+length].split("\0")[0]
        self.off += length
        return s

b = BinFile("Circle0100001.bin")
print "Name:", b.name
print "Particles:", b.num_particles
print "Position of first particle", b.particles[0].position

在您的示例数据上运行时,它会打印:

Name: Circle01
Particles: 1066
Position of first particle (-1.7062506675720215, 4.9283280372619629, -6.4365010261535645)

【讨论】:

  • 这个还是有问题的。当我在 Blender 中添加粒子作为顶点时,我们在列表中走得最远的地方就是它们所占据的最奇怪的位置。列表结束时,我的粒子有位置(0.000844058589658279,7050352963557452199965574521990426C-41)或(201863462912.0(201863462912.0)或(201863462912.0,-9.4222019546613521C-38,2.072240169043539524016904353952401690435395CE-4 1),它给出了糟糕的结果。我需要知道问题出在您编写的脚本还是 bin 文件本身,以及是否有某种修复。
  • 向该脚本添加一些调试打印语句,以查看列表末尾的位置是否变得奇怪。如果他们不这样做,那么问题出在您的 Blender 脚本中。
  • 我刚刚检查过,它们的值很奇怪,分布在整个列表中,而不仅仅是最后。我认为错误不在我的脚本中,因为我在从粒子中读取这些值时打印了这些值,没有详细说明。
  • 你是对的:我更新了答案中的程序。我有一个宽度错误的字段,并且跳过了几个字段。
  • 最后一件事:有没有办法加快文件的加载速度?
【解决方案2】:

您需要知道文件中的数据是如何编码的。如果您有这些信息,您可以使用struct package 将二进制数据转换为可以在python 中使用的东西。

希望对你有帮助

【讨论】:

  • @terabytest:查看 Ned 的评论以了解如何获取它们(您可能需要使用 add / show .. more comments 展开 cmets)。
【解决方案3】:

谢谢大家,我找到了文件。这里我上传了,附上一个粒子文件给你。

http://www.mediafire.com/download.php?xujqjghkcim

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多