【问题标题】:Ruby: How to convert a string to binary and write it to fileRuby:如何将字符串转换为二进制并将其写入文件
【发布时间】:2010-12-08 17:06:28
【问题描述】:

数据是一个 UTF-8 字符串:

data = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'

我尝试了File.open("data.bz2", "wb").write(data.unpack('a*')) 的各种 unpack put 变体,但都没有成功。我只是得到文件中的字符串而不是字符串中的 UTF-8 编码的二进制数据。

【问题讨论】:

    标签: ruby utf-8


    【解决方案1】:
    data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08"
    
    File.open("data.bz2", "wb") do |f|
      f.write(data)
    end
    

    write 将字符串作为参数,并且您有一个字符串。无需先解压缩该字符串。您使用 Array#pack 来转换一个数组,例如数字转换成二进制字符串,然后您可以将其写入文件。如果你已经有一个字符串,你不需要打包。在从文件(或任何地方)读取此类二进制字符串后,您可以使用 unpack 将其转换回数组。

    另请注意,当使用不带块的File.open 并且不保存文件对象(如File.open(arguments).some_method)时,您会泄漏文件句柄。

    【讨论】:

    • 我需要文件中的二进制值而不是字符串。这段代码和我的代码一模一样。
    • 您似乎认为包含字符串“\x01\x02”的文件与包含字节 1 后跟字节 2 的文件不同。事实并非如此。如果您只是将字符串写入文件,它将执行您想要的操作。
    【解决方案2】:

    尝试使用双引号:

    data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03"
    

    然后按照 sepp2k 的建议进行操作。

    【讨论】:

    • Ahrg,我完全错过了他的字符串是单引号的事实。 +1
    • 谢谢。当我阅读 sepp2k 的评论时,我自己解决了这个问题。魔鬼在细节中。
    猜你喜欢
    • 2015-10-27
    • 2017-09-12
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多