【问题标题】:NSData from hex String?来自十六进制字符串的 NSData?
【发布时间】:2015-11-20 19:20:30
【问题描述】:

我知道有人问过ObjectiveC 这个问题,但我的Swift 还不够强大,无法音译char *bytes 的东西。

给定

let string = "600DBEEF"

如何创建代表这 4 个字节的 NSData60 0D BE EF

【问题讨论】:

  • 字节是对 BLE 事务中的一些数据运行 String(aData.bytes[0], radix: 16) 的结果

标签: string swift hex nsdata swift2


【解决方案1】:

快速回答,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)

【讨论】:

    【解决方案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 对象:

    Data(hex: "600dBeef")
    

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 2011-08-27
      • 2017-07-01
      • 2013-05-07
      • 2016-07-28
      • 2010-10-04
      • 2014-12-17
      • 2011-11-23
      相关资源
      最近更新 更多