【问题标题】:How do i write a string containing an array of integers to a file as bytes in Ruby?如何在 Ruby 中将包含整数数组的字符串作为字节写入文件?
【发布时间】:2012-02-18 21:31:55
【问题描述】:

如何将二进制字符串数组表示(原始)写入文件?

#str is a String not an Array
str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"

File.open('/Users/file.zip', "wb") do |file|
   file.write(str)
end

上面的代码不起作用。我该如何解决?

【问题讨论】:

标签: ruby file-io io bytearray


【解决方案1】:

Array#pack 和 String#unpack 转换为二进制字符串并返回。对这些字符串使用IO#write 和IO#read。

【讨论】:

    【解决方案2】:

    你确定要吗

    str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"
    

    而不是

    str = [80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]
    

    关于写作:#write 调用 #to_s 将数组转换为其字符串表示形式,这不是您想要的。要控制该转换,请使用Array#pack。试试file.write(str.pack('C*'))。

    【讨论】:

    • str 是一个字符串,所以如果我这样做,我会得到 NoMethodError (undefined method `pack' for #<0x007f833ce472f0>
    【解决方案3】:

    它有效,但我认为它太脏了

    str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"
    int_array = str.gsub('[', '').gsub(']', '').split(', ').collect{|i| i.to_i}
    File.open('/Users/file.zip', "wb") do |file|
       file.write(int_array.pack('C*'))
    end
    

    【讨论】:

      【解决方案4】:

      这里的大多数答案都假设您使用的是数组,而不是您所说的字符串(如您的示例所示)。这应该适用于您在示例中显示的字符串:

      File.open('/Users/file.zip', "wb") { |f| f.write(JSON.parse(str).pack('C*')) }
      

      请确保require 'json'。

      【讨论】:

      • 使用JSON.parse(str)而不是eval(str)会更安全,以防字符串包含system('rm -rf /')之类的危险代码,因为这是数组的有效json表示。
      • 非常感谢!请使用 JSON.parse(str) 更新拯救生命的主要答案...
      【解决方案5】:

      我想知道为什么没有人提到字符串转义。这有效:

      str = "\x50\x4B\x03\x04\x0A\0\0\0\0\0\xB6\x79\x39\x40\0\0\0\0"    
      File.open('file.zip', "wb") { |file| file.write(str) }
      

      不幸的是,没有十进制转义,因此您必须将数字转换为十六进制或八进制。

      【讨论】:

        猜你喜欢
        • 2016-05-05
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 2017-03-22
        • 1970-01-01
        相关资源
        最近更新 更多