【问题标题】:Write binary file in Ruby用 Ruby 编写二进制文件
【发布时间】:2009-06-02 20:52:15
【问题描述】:

有没有像我们以前在 C/C++ 中那样将二进制数据写入二进制文件的简单方法?例如,如何在不使用花哨的数学的情况下创建具有序列化 4 字节整数值的 4 字节文件?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您可以使用Array#packString#unpack 在二进制表示之间进行转换。将它们与IO#writeIO#read 结合起来,就可以了。

    【讨论】:

    • 是的,我认为你的答案是这个特定问题的更好答案! +1
    • 这似乎是我想做的,但我仍然不知道该怎么做。我应该使用什么格式解压二进制字符串以使用 String#unpack
    【解决方案2】:

    我最近遇到了类似的工作问题。我使用了BinData gem,效果很好。 您只需执行以下操作:

    File.open('test.bin', 'wb') {|file| BinData::Int32be.new(12345).write(file) }
    

    而且您无需记住任何Array#pack 代码。

    【讨论】:

    • gem 正在为您打包/拆包。源代码here。就像答案说的那样,它只是让你不必记住如何/使用哪些包代码
    【解决方案3】:

    您可以使用Marshal.dumpMarshal.load 方法。

    这是一个链接:http://en.wikipedia.org/wiki/Serialization#Ruby

    另一个将数据保存到文件中:http://rubylearning.com/satishtalim/object_serialization.html

    【讨论】:

    • 这工作正常,但我仍然无法使用这个获得 4 字节文件: File.open('test.bin', 'wb') {|file|文件
    • 不用担心。 Pesto 的答案看起来很有希望。
    【解决方案4】:

    在我看来,红宝石不是为这些任务而生的。如果您必须大量写入二进制文件,最简单的方法是为此编写一些 c 函数并从 ruby​​ 调用它们,使用 swig 很容易。我现在正在做同样的事情来编写一个raid模拟器。

    【讨论】:

    • 没错 - Ruby 可能是为其他东西设计的,但我们已经有一个相当大的 Rails 应用程序,而我们只是面临处理二进制文件的需要。不过感谢您的回答 - 我们可能会考虑用 C/C++ 编写本机扩展。
    • 用 C/C++ 编写这些函数的问题在于,这样做最终可能会将它们绑定到特定的 Ruby 实现。见stackoverflow.com/questions/3292610/what-version-of-ruby/…
    • 当搜索“ruby write binary”时,这个问题作为谷歌搜索结果弹出,这个答案实际上直接在搜索结果中显示为相关的简介:Ruby 非常适合 OP 的布局.编写一个 C 函数,引入一个全新的生态系统 (SWIG/C),与简单地使用现有方法处理二进制数据相比,可能让其他开发人员使用 C 加速编写一些二进制数据将非常复杂(参见其他答案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2010-09-11
    • 2011-12-07
    • 2015-11-29
    • 2017-10-20
    相关资源
    最近更新 更多