2016-10-27 22 views
2

PythonにはSwiftで苦労している非常に便利なライブラリメソッド(binascii.a2b_hex(keyStr)とbinascii.hexlify(keyBytes))があります。 Swiftですぐに利用できるものはありますか?そうでない場合は、どのように実装しますか?すべての境界と他のチェック(偶数の長さのキーのような)が行われていることを考えると、Swiftの16進数/ 2進数の文字列変換

+0

は大きな数字には適用されません。私は32桁の16進数について話しています。効率的な方法は、このような大きな文字列を持ち、入力をバイト配列に変換することです。 Swift stdlibにはBigIntegerとstdlibでのこれらの種類の変換は今のところありません。 – johndoe

答えて

0

Pythonと数字を変換するとき、それは実行のチェックには本当に慣れていない、しかし、あなたは以下の機能を拡張することができます

func convert(_ str: String, fromRadix r1: Int, toRadix r2: Int) -> String? { 
    if let num = Int(str, radix: r1) { 
     return String(num, radix: r2) 
    } else { 
     return nil 
    } 
} 

convert("11111111", fromRadix: 2, toRadix: 16) 
convert("ff", fromRadix: 16, toRadix: 2) 
0

をスウィフト2

extension NSData { 
    class func dataFromHexString(hex: String) -> NSData? { 
     let regex = try! NSRegularExpression(pattern: "^[0-9a-zA-Z]*$", options: .CaseInsensitive) 
     let validate = regex.firstMatchInString(hex, options: NSMatchingOptions.init(rawValue: 0), range: NSRange(location: 0, length: hex.characters.count)) 
     if validate == nil || hex.characters.count % 2 != 0 { 
      return nil 
     } 
     let data = NSMutableData() 
     for i in 0..<hex.characters.count/2 { 
      let hexStr = hex.substring(i * 2, length: 2) 
      var ch: UInt32 = 0 
      NSScanner(string: hexStr).scanHexInt(&ch) 
      data.appendBytes(&ch, length: 1) 
     } 
     return data 
    } 
} 

let a = 0xabcd1234 
print(String(format: "%x", a)) // Hex to String 
NSData.dataFromHexString("abcd1234") // String to hex 
8

Dataスウィフト3から「何を持っていません組み込み "メソッドを使用して内容を 16進文字列として出力するか、16進文字列からData値を作成します。

「データから16進文字列への方法」のメソッドは、たとえば次のとおりです。 How to convert Data to hex string in swiftまたはHow to print the content of a variable type Data using swift?またはconverting string to data in swift 3.0である。ここで第一のリンクからインプリメンテーションである:ここで

extension Data { 
    func hexEncodedString() -> String { 
     return map { String(format: "%02hhx", $0) }.joined() 
    } 
} 

は(スウィフト3および改善に翻訳コードレビューにHex String to Bytes (NSData)から採取した、) 変換「データへの16進文字列」逆の可能な実装である としてfailable inititializer:

extension Data { 

    init?(fromHexEncodedString string: String) { 

     // Convert 0 ... 9, a ... f, A ...F to their decimal value, 
     // return nil for all other input characters 
     func decodeNibble(u: UInt16) -> UInt8? { 
      switch(u) { 
      case 0x30 ... 0x39: 
       return UInt8(u - 0x30) 
      case 0x41 ... 0x46: 
       return UInt8(u - 0x41 + 10) 
      case 0x61 ... 0x66: 
       return UInt8(u - 0x61 + 10) 
      default: 
       return nil 
      } 
     } 

     self.init(capacity: string.utf16.count/2) 
     var even = true 
     var byte: UInt8 = 0 
     for c in string.utf16 { 
      guard let val = decodeNibble(u: c) else { return nil } 
      if even { 
       byte = val << 4 
      } else { 
       byte += val 
       self.append(byte) 
      } 
      even = !even 
     } 
     guard even else { return nil } 
    } 
} 

例:これらの答え@anonymous

// Hex string to Data: 
if let data = Data(fromHexEncodedString: "0002468A13579BFF") { 
    let idata = Data(data.map { 255 - $0 }) 

    // Data to hex string: 
    print(idata.hexEncodedString()) // fffdb975eca86400 
} else { 
    print("invalid hex string") 
} 
+1

これは1,000,000ポイントに値する。スーパークリーンで便利。共有ありがとう! – dustinrwh

関連する問題