如何将二进制字符串数组表示(原始)写入文件?
#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
上面的代码不起作用。我该如何解决?
答案 0 :(得分:7)
这里的大多数答案都假设您使用的是数组,而不是您所说的字符串(如您的示例所示)。这应该与您在示例中显示的String一起使用:
File.open('/Users/file.zip', "wb") { |f| f.write(JSON.parse(str).pack('C*')) }
确保require 'json'
。
答案 1 :(得分:0)
Array#pack
和String#unpack
转换为二进制字符串并返回。使用IO#write
和IO#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) }
不幸的是,没有十进制转义符,因此您必须将数字转换为十六进制或八进制。