2016-05-16 6 views
2

Ich versuche, diese Datei zu entschlüsseln, die in IBM437 in lesbare UTF ich an dem Punkt bin, ist, wo ich denke, ich habe es fast, aber ich bin immer ein ArgumentError wo die Zeichenfolge nul Bytes enthält Ich bin mir bewusst, wie zu gsub heraus nul Bytes mit: .gsub("\u0000", '') aber ich kann nicht herausfinden, wo gsub die Bytes aus.String enthält NUL Bytes

Hier ist die Quelle:

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 

Und hier ist der file

Kann mir jemand sagen, was falsch ich hier tue?

+0

Warum nicht die 'encoding' Option auf Ihrer' File' lesen? – tadman

+0

@tadman Was meinst du? – 13aal

+0

Das sieht nach [ziemlich spaßige Herausforderung] aus (http://www2.mps.mpg.de/homes/heller/downloads/files/SETI_rules.txt), aber Sie sind auf dem falschen Weg, als IBM437 zu dekodieren. Schauen Sie sich die Hinweise an. – matt

Antwort

1

Die folgenden Werke für mich:

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

Hier brechen wir die riesige Kette von 0 und 1 (die Datei):

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

der file.scan(/......../).map{|s| s.to_i(2)}.pack('U*') im Stich lassen brechen ein Array von Strings mit jeweils 8 Zeichen. Es sieht so aus: ['00001111', '11110000', ...].

  1. arr.map{|s| s.to_i(2)}

Von Schritt 1 wir ein Array von Strings, die die verschiedenen Zeichen in binärer Schreibweise bekam. Wir können durch die Anwendung s.to_i(2) einer dieser Zeichenketten (genannt s) konvertieren, da der Parameter ‚2‘, sagt der Methode to_i Basis zu verwenden 2. So '00000011'.to_i(2) kehrt 3.

Wir wenden diese auf alle Zeichen von map verwenden. So haben wir jetzt ein Array, das wie [98, 82, 49, 39, ...] aussieht.

  1. arr.pack('U*')

Von Schritt 2 haben wir eine Reihe von ganzen Zahlen haben jeweils ein Zeichen darstellen. Wir können jetzt die pack-Methode verwenden, um unser Array von ganzen Zahlen in eine Zeichenfolge umzuwandeln. Der Parameter, den wir für pack verwenden, ist U, um ihm zu sagen, dass die ganzen Zahlen tatsächlich UTF-8-Zeichen sind.

+0

Das macht vollkommen Sinn, danke dafür, es so zu brechen – 13aal