2017-03-12 3 views
1

Ich versuche, eine Hex-Zeichenfolge in Text zu konvertieren. DieseHex String zu Textkonvertierung - swift 3

ist das, was ich habe:

// Str to Hex 
func strToHex(text: String) -> String { 
    let hexString = text.data(using: .utf8)!.map{ String(format:"%02x", $0) }.joined() 

    return "0x" + hexString 

} 

und ich versuche, die Hex-String zu umkehren, die ich gerade wieder auf dem ursprünglichen erstellt haben.

So zum Beispiel:

let foo: String = strToHex(text: "K8") //output: "0x4b38" 

und ich würde so etwas wie

let bar: String = hexToStr(hex: "0x4b38") //output: "K8" 

jemand tun kann mir helfen? Danke

+0

Hier ist ein Verfahren zum Erstellen von Daten aus einem Hex-String: http://stackoverflow.com/a/40278391/1187415, dann verwenden 'String (Daten :, Kodierung:)' –

+0

Vielleicht ist das, was Sie suchen http://stackoverflow.com/questions/31816182/how-to-parse-a-string-of-hex-into-ascii-equivalent -in-swift-2? –

Antwort

3

Sie wahrscheinlich so etwas wie diese verwenden:

func hexToStr(text: String) -> String { 

    let regex = try! NSRegularExpression(pattern: "(0x)?([0-9A-Fa-f]{2})", options: .caseInsensitive) 
    let textNS = text as NSString 
    let matchesArray = regex.matches(in: textNS as String, options: [], range: NSMakeRange(0, textNS.length)) 
    let characters = matchesArray.map { 
     Character(UnicodeScalar(UInt32(textNS.substring(with: $0.rangeAt(2)), radix: 16)!)!) 
    } 

    return String(characters) 
} 
1

NSRegularExpression ist übertrieben für den Job. Sie können zu einem Zeitpunkt durch Greifen zwei Zeichen der Zeichenfolge in Byte-Array konvertieren:

func hexToString(hex: String) -> String? { 
    guard hex.characters.count % 2 == 0 else { 
     return nil 
    } 

    var bytes = [CChar]() 

    var startIndex = hex.index(hex.startIndex, offsetBy: 2) 
    while startIndex < hex.endIndex { 
     let endIndex = hex.index(startIndex, offsetBy: 2) 
     let substr = hex[startIndex..<endIndex] 

     if let byte = Int8(substr, radix: 16) { 
      bytes.append(byte) 
     } else { 
      return nil 
     } 

     startIndex = endIndex 
    } 

    bytes.append(0)  
    return String(cString: bytes) 
} 
+0

'String (cString:)' erwartet ein * Null-terminiertes * UTF-8 Daten. Ihr Array ist nicht nullterminiert, was zu undefiniertem Verhalten führt. Darüber hinaus funktioniert dies nicht mit Nicht-ASCII-Zeichen. –

+0

@MartinR danke. Fest –