2016-05-16 209 views
2

我試圖解碼這個文件是在IBM437到可讀UTF我在我認爲我幾乎得到它的點,但我得到一個ArgumentError其中字符串包含nul字節,我知道如何gsubnul字節使用: .gsub("\u0000", '')但是我不知道在哪裏gsub的字節出來。字符串包含NUL字節

這裏的源:

def gather_info 
    file = './lib/SETI_message.txt' 
    File.read(file).each_line do |gather| 
    packed = [gather].pack('b*') 
    ec = Encoding::Converter.new(packed, 'utf-8') 
    encoding_forced = packed.encode(ec) 
    File.open('packed.txt', 'a+'){ |s| s.puts(encoding_forced.gsub("\u0000", '')) } 
    end 
end 

gather_info 

而這裏的file

誰能告訴我,我做錯了什麼嗎?

+0

爲什麼不在你的'File'上設置'encoding'選項? – tadman

+0

@tadman你是什麼意思?' – 13aal

+0

看起來像[相當有趣的挑戰](http://www2.mps.mpg.de/homes/heller/downloads/files/SETI_rules.txt),但是您嘗試解碼爲IBM437的錯誤軌道上。看看給出的提示。 – matt

回答

1

對我來說,以下工作:

file = File.read('SETI.txt') 
packed = file.scan(/......../).map{|s| s.to_i(2)}.pack('U*') 
File.write('packed.txt', packed) 

讓我們打破file.scan(/......../).map{|s| s.to_i(2)}.pack('U*')下來:

  1. file.scan(/......../)

在這裏,我們打破0和1(文件)的巨大串入一個包含8個字符的字符串數組。它看起來像這樣:['00001111','11110000',...]。

  • arr.map{|s| s.to_i(2)}
  • 從步驟1,我們得到表示二進制符號的不同的字符的字符串的數組。因爲參數「2」說的方法to_i使用map使用基地2。所以'00000011'.to_i(2)返回3

    我們將此所有文字,我們可以通過應用s.to_i(2)轉換這些字符串(稱爲s)之一。 所以我們現在有一個看起來像[98, 82, 49, 39, ...]的數組。

  • arr.pack('U*')
  • 從步驟2中,我們有表示每個字符的整數數組。我們現在可以使用pack方法將我們的整數數組轉換爲一個字符串。我們用於pack的參數是U,告訴他整數實際上是UTF-8字符。

    +0

    這非常合理,謝謝你這樣分手 – 13aal