2012-01-25 25 views
4

如何將(原始)二進制字符串數組表示形式寫入文件?如何在Ruby中將包含整數數組的字符串作爲字節寫入?

#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

我想這就是你要搜索的內容:http://stackoverflow.com/questions/941856/write-binary-file-in-ruby(pack/unpack methods)。 – Jef

回答

7

這裏的大多數答案假設你使用數組,而不是字符串,你說(和你的例子顯示) 。這應該與您在本例中顯示字符串的工作:

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

只要確保require 'json'

+0

如果字符串包含諸如system('rm -rf /')'這樣的危險代碼,那麼使用'JSON.parse(str)'而不是'eval(str)'會更安全,因爲這是一個有效的json表示的數組。 –

+0

非常感謝!請用JSON.parse(str)更新救命的主要答案... – CelinHC

0

Array#packString#unpack轉換爲二進制字符串並返回。對這些字符串使用IO#writeIO#read

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該數組轉換成字符串represenation,這是不是你想要的。要控制該轉換,請使用Array#pack。嘗試file.write(str.pack('C*'))

+0

str是一個字符串,所以如果我這樣做,我得到NoM​​ethodError(未定義的方法'包'爲#): – CelinHC

+0

這是第一部分。 – Reactormonk

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

不幸的是,沒有十進制轉義,所以你必須將你的數字轉換爲十六進制或八進制。

相關問題