2016-03-20 11 views
1

Ich habe eine Zeichenfolge von mehreren hundert Bytes und einige Int32-Werte. Ich möchte diese wörtlich in eine Datei schreiben.Swift - Schreiben eines Bytestreams in Datei

Ich habe viele vorgeschlagene Lösungen ausprobiert und keine hat für mich gearbeitet. Ich erhalte irrelevante Klammern oder Leerzeichen oder Kommas in der Datei.

Kann jemand eine einfache, zuverlässige Lösung vorschlagen?

Ich dachte meine Frage war sehr klar, aber nach dem Lesen der Kommentare habe ich es vereinfacht.

Wie schreibe und/oder füge ich "12345" an eine Datei an, so dass die Datei die folgenden Hex-Werte enthält: 3132333435?

Das beste Ergebnis, das ich erhalten kann, ist < 3132333435>, durch Schreiben einer NSData-Zeichenfolge.

Ich kann das gewünschte Ergebnis mit diesem Link erhalten: Does swift have a protocol for writing a stream of bytes?, aber ich kann keine Daten an die Datei anhängen, die ich erstellt habe.

+0

Ich bin interessiert zu wissen, warum jemand meine Frage herabgestimmt hat. Es ist eine gültige und relevante Frage und es gibt keine befriedigende Antwort, die ich finden kann –

+0

Die nächste Lösung, die ich gefunden habe, ist: http://stackoverflow.com/questions/24184429/does-swift-have-a-protocol-for- Schreibe-ein-Stream-of-Bytes? Rq = 1, aber ich möchte in der Lage sein, an eine Datei anzuhängen, sowie zu schreiben. –

+0

"Es ist eine gültige und relevante Frage" Nicht, wenn niemand verstehen kann, was die Frage _is_ ist. Versuchen Sie vielleicht etwas großzügiger mit Ihren Beispielen für Eingaben und die gewünschte Ausgabe umzugehen. – matt

Antwort

2

Ich würde vorschlagen, NSFileHandle zu verwenden.

Ich habe so getestet. Ich begann mit einer Datei ~/Desktop/test.txt mit dem Wort "testen". Ich lief dann diesen Code:

let s = "12345" 
    let d = s.dataUsingEncoding(NSASCIIStringEncoding)! 
    let path = ("~/Desktop/test.txt" as NSString).stringByExpandingTildeInPath 
    if let fh = NSFileHandle(forWritingAtPath: path) { 
     fh.seekToEndOfFile() 
     fh.writeData(d) 
     fh.closeFile() 
    } 

Das Ergebnis war, dass die Datei enthielt nun

testing12345 

Ein Hex-Dump ergab, dass das zugrunde liegende Bytes war:

74 65 73 74 69 6E 67 31 32 33 34 35 

Ich glaube, das ist, was Sie sagte du willst es erreichen.

Auch eine weitere commment:

Das beste Ergebnis, das ich bekommen kann, ist <3132333435>

Es klingt hier, als ob das Problem nur ist, dass Sie nicht wissen, wie die Konsole lesen Ausgabe. Die < und > sind nicht wirklich in der Datei; Sie sind nur ein Teil der Konsolenrepräsentation von Daten. Es wäre besser, BBEdit/TextWrangler oder einen dedizierten Hex-Dumper zu verwenden, um das tatsächliche Byte der Datei zu sehen.

+0

Danke für das Hinzufügen des Codes. Ich mag die Einfachheit der Datei-Griff-Ansatz. Ich weiß, wie man ein hex editor Nach einem meiner Versuche habe ich <3132333435> in der Datei gesehen Ich kann mich nicht erinnern, wie ich das geschafft habe! –

+0

"Ich habe '<3132333435>' in der Datei gesehen "Wahrscheinlich haben Sie die NSData über eine String - Repräsentation übergeben ist nur eine Logging-Darstellung) und schrieb dann _that_ in die Datei. – matt

+0

matt, danke für den Hinweis, ich habe das graue Häkchen verpasst! –

0

Grundsätzlich wird das Problem, Ihre Daten korrekt in einen Zeiger umgewandelt werden, um es auf NSOutputStream.write zu erhalten. Die folgende Erweiterung sollte das tun, was Sie brauchen:

extension NSOutputStream { 
    enum WriteErrors : ErrorType { 
     case UTF8ConversionFailed 
    } 

    func write(string:String) throws -> Int { 
     guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else { 
      throw WriteErrors.UTF8ConversionFailed 
     } 

     return write(UnsafePointer(data.bytes), maxLength: data.length) 
    } 

    func write(var i:Int32) throws -> Int { 
     return withUnsafePointer(&i) { 
      self.write(UnsafePointer($0), maxLength: sizeof(Int32)) 
     } 
    } 
} 

Beachten Sie, dass rohe Binärdaten in eine Datei schreiben, ist schlecht beraten, sollten Sie zunächst die Byte-Reihenfolge werden die Standardisierung, aber ich lasse das als eine Übung für den Leser.

+0

David, danke für deine konstruktive Antwort. Ich werde mit deinem Code experimentieren. In Bezug auf Ihren Kommentar zu "rohen Binärdaten" sind mir die Probleme sehr wohl bekannt. :-) Ich schreibe in ein Öl-Industrie-Dateiformat von 1975, das ursprünglich für 1/2 "9-Spur-Bänder entwickelt wurde! Das Format ist wohldefiniert, wobei Zwei- und Vier-Byte-Zweierkomplement-Ganzzahlen, Vier-Byte-Groß- Endian IEEE Gleitkommazahlen und ASCII-Text.Das Format unterstützt auch IBM Gleitkommazahlen und EBCDIC-Text, für Rückwärtskompatibilität! –