我应该如何将二进制字符串数组表示原始写入文件?
#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
上面的代码无法正常工作。我该如何修复它?
我应该如何将二进制字符串数组表示原始写入文件?
#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
这里大多数答案都假设您使用的是数组,而不是您所述的字符串(正如您的示例所显示的那样)。以下内容适用于您在示例中展示的字符串:
File.open('/Users/file.zip', "wb") { |f| f.write(JSON.parse(str).pack('C*')) }
请确保要require 'json'
。
system('rm -rf /')
,那么使用 JSON.parse(str)
而不是 eval(str)
会更安全,因为这是一个有效的数组 JSON 表示形式。 - Simon Perepelitsa你确定要吗?
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 = "[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
我想知道为什么没有人提到字符串转义。这样可以实现:
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) }
很遗憾,没有十进制转义,所以您必须将数字转换为十六进制或八进制。
Array#pack
和 String#unpack
可以将数据转换为二进制字符串并进行反向操作。使用 IO#write
和 IO#read
处理这些字符串。