2015-08-26 26 views
1

我知道這個問題已被要求爲ObjectiveC,但我的Swift還不夠強大,音譯char *bytes東西。來自十六進制字符串的NSData?

因此,考慮

let string = "600DBEEF" 

如何創建一個NSData表示這些4個字節:60 0D BE EF

+0

字節是運行String(aData.bytes [0],r adix:16)'來自BLE交易的一些數據 –

回答

7

隨着Swift3的到來和新的基礎數據類型,我終於盤旋迴本:

extension UnicodeScalar { 
    var hexNibble:UInt8 { 
     let value = self.value 
     if 48 <= value && value <= 57 { 
      return UInt8(value - 48) 
     } 
     else if 65 <= value && value <= 70 { 
      return UInt8(value - 55) 
     } 
     else if 97 <= value && value <= 102 { 
      return UInt8(value - 87) 
     } 
     fatalError("\(self) not a legal hex nibble") 
    } 
} 

extension Data { 
    init(hex:String) { 
     let scalars = hex.unicodeScalars 
     var bytes = Array<UInt8>(repeating: 0, count: (scalars.count + 1) >> 1) 
     for (index, scalar) in scalars.enumerated() { 
      var nibble = scalar.hexNibble 
      if index & 1 == 0 { 
       nibble <<= 4 
      } 
      bytes[index >> 1] |= nibble 
     } 
     self = Data(bytes: bytes) 
    } 
} 

現在我可以構建數據對象以類似於它們的打印形式:

Data(hex: "600dBeef") 
3

搶答迅速,安裝XCode beta 6

let string = "600DBEEF" 

    let length = string.characters.count 


    let rawData = UnsafeMutablePointer<CUnsignedChar>.alloc(length/2) 
    var rawIndex = 0 

    for var index = 0; index < length; index+=2{ 
     let single = NSMutableString() 
     single.appendString(string.substringWithRange(Range(start:string.startIndex.advancedBy(index), end:string.startIndex.advancedBy(index+2)))) 
     rawData[rawIndex] = UInt8(single as String, radix:16)! 
     rawIndex++ 
    } 

    let data:NSData = NSData(bytes: rawData, length: length/2) 
    rawData.dealloc(length/2) 
相關問題