1
我知道這個問題已被要求爲ObjectiveC
,但我的Swift
還不夠強大,音譯char *bytes
東西。來自十六進制字符串的NSData?
因此,考慮
let string = "600DBEEF"
如何創建一個NSData
表示這些4個字節:60 0D BE EF
?
我知道這個問題已被要求爲ObjectiveC
,但我的Swift
還不夠強大,音譯char *bytes
東西。來自十六進制字符串的NSData?
因此,考慮
let string = "600DBEEF"
如何創建一個NSData
表示這些4個字節:60 0D BE EF
?
隨着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")
搶答迅速,安裝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)
字節是運行String(aData.bytes [0],r adix:16)'來自BLE交易的一些數據 –