NSData от шестнадесетичен низ?

Знам, че този въпрос е зададен за ObjectiveC, но моят Swift все още не е достатъчно силен, за да транслитерира нещата от char *bytes.

Така дадено

let string = "600DBEEF"

Как да създам NSData, което представлява тези 4 байта: 60 0D BE EF?


person Travis Griggs    schedule 26.08.2015    source източник
comment
Байтовете са резултат от изпълнение на String(aData.bytes[0], radix: 16) върху някои данни от BLE транзакция   -  person Travis Griggs    schedule 26.08.2015


Отговори (2)


С пристигането на Swift3 и новия тип Foundation Data най-накрая се върнах към това:

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")
person Travis Griggs    schedule 28.06.2016

Отговорете бързо, XCode бета 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)
person Kedar    schedule 26.08.2015