2017-03-16 2 views
1

geändert werden Ich habe ein Problem, CChar zu Daten unter GBK-Codierung zu ändern. Kann mir jemand einen Tipp geben, wie es geht, würde es viel helfen Die Syntax schien sich zu ändern, so bin ich ein bisschen ratlos, wie es gehtWie von CChar zu Daten in Swift 3

die vorher wurde zu NSData geändert, aber seit der Syntax hat zu Data geändert wurde, bin ich mir nicht sicher, wie ich den Austausch durchführen soll.

let cfEnc = CFStringEncodings.GB_18030_2000 
let enc = CFStringConvertEncodingToNSStringENcoding(CFStringEncoding(cfEnc.rawValue)) 
let ccharStr = "aaa".cString(using: String.Encoding(rawValue: enc))! 
let tmp = NSData(bytes: ccharStr, length: ccharStr.count) 
self.writeValue(tmp) 

jetzt habe ich

let cfEnc = CFStringEncodings.GB_18030_2000 
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue)) 

let aaa = "aaa\n" 
var stringCChar = aaa.cString(using: String.Encoding(rawValue: enc)) 
let stringData = Data(bytes: &stringCChar, count: (stringCChar?.count)!) // but this exchange can't show the correct result... 
self.writeValue(stringData) 
änderte sich mit dieser

kann jemand helfen?

Antwort

1

Das Problem in

let stringData = Data(bytes: &stringCChar, count: (stringCChar?.count)!) 

ist, dass Sie die Adresse eines optional zum Data Konstruktor sind vorbei, was bedeutet, dass der Speicherinhalt des struct Optional gelesen wird, nicht die Zeichendaten.

So müssen Sie stringCChar, z. mit optional Bindung:

let str = "your String" 

let cfEnc = CFStringEncodings.GB_18030_2000 
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue)) 

if let stringCChar = str.cString(using: String.Encoding(rawValue: enc)) { 
    let stringData = Data(bytes: stringCChar, count: stringCChar.count) 
    // ... 
} else { 
    // cannot encode string in GB_18030_2000 
} 

Eine etwas einfachere Lösung ist

let str = "your String" 

let cfEnc = CFStringEncodings.GB_18030_2000 
let enc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue)) 

if let stringData = str.data(using: String.Encoding(rawValue: enc)) { 
    // .... 
} else { 
    // cannot encode string in GB_18030_2000 
} 

beachten nur, dass die erste Lösung ein nachlauf Null zurück (C-String Terminator) in den Daten enthalten wird, während die zweite Lösung ‚doesn t.

+0

OMG JA! du hast ja so recht! Ich kann Sachen richtig bekommen !!! Vielen Dank eine Million !!! –

Verwandte Themen