String 来自十六进制字符串的NSData?

String 来自十六进制字符串的NSData?,string,swift,hex,nsdata,swift2,String,Swift,Hex,Nsdata,Swift2,我知道有人问我这个问题是为了ObjectiveC,但我的Swift还不够强大,无法翻译char*bytes之类的东西 如此给定 let string = "600DBEEF" 如何创建表示这4个字节的NSData:60 0D BE EF?以swift、XCode beta 6回答 let string = "600DBEEF" let length = string.characters.count let rawData = UnsafeMutablePoint

我知道有人问我这个问题是为了
ObjectiveC
,但我的
Swift
还不够强大,无法翻译
char*bytes
之类的东西

如此给定

let string = "600DBEEF"

如何创建表示这4个字节的
NSData
60 0D BE EF

以swift、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)
let string=“600DBEEF”
让长度=string.characters.count
让rawData=unsafemeutablepointer.alloc(长度/2)
var rawIndex=0
对于var指数=0;指数<长度;指数+=2{
设single=NSMutableString()
single.appendString(string.substringWithRange(范围(开始:string.startIndex.advancedBy(索引),结束:string.startIndex.advancedBy(索引+2)))
rawData[RAWDINDEX]=UInt8(单字符串,基数:16)!
原始索引++
}
let data:NSData=NSData(字节:rawData,长度:length/2)
rawData.dealloc(长度/2)

用swift、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)
let string=“600DBEEF”
让长度=string.characters.count
让rawData=unsafemeutablepointer.alloc(长度/2)
var rawIndex=0
对于var指数=0;指数<长度;指数+=2{
设single=NSMutableString()
single.appendString(string.substringWithRange(范围(开始:string.startIndex.advancedBy(索引),结束:string.startIndex.advancedBy(索引+2)))
rawData[RAWDINDEX]=UInt8(单字符串,基数:16)!
原始索引++
}
let data:NSData=NSData(字节:rawData,长度:length/2)
rawData.dealloc(长度/2)

<代码> > p>随着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)
    }
}

随着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)
    }
}

字节是对来自BLE事务的某些数据运行
String(aData.bytes[0],基数:16)
的结果。字节是对来自BLE事务的某些数据运行
String(aData.bytes[0],基数:16)
的结果