如何在Ruby中将包含整数数组的字符串作为字节写入?

时间:2012-01-25 17:23:49

标签: ruby file-io io bytearray

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

#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

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

5 个答案:

答案 0 :(得分:7)

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

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

确保require 'json'

答案 1 :(得分:0)

Array#packString#unpack转换为二进制字符串并返回。使用IO#writeIO#read表示这些字符串。

答案 2 :(得分:0)

您确定要

吗?
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*'))

答案 3 :(得分:0)

  

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

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 :(得分:0)

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

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) }

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