美文网首页
Swift与硬件打交道封装的方法

Swift与硬件打交道封装的方法

作者: T92 | 来源:发表于2017-11-08 11:27 被阅读321次

Data转HexString

///Data转String
    func hexString(data: Data) -> String {
        return data.withUnsafeBytes({ (bytes: UnsafePointer<UInt8>) -> String in
            let buffer = UnsafeBufferPointer(start: bytes, count: data.count)
            return buffer.map{String(format: "%02hhx", $0)}.reduce("", {$0 + $1})
        })
    }

或者

extension Data{
    
    ///Data转HexString
    func hexString() -> String {
        return self.withUnsafeBytes({ (bytes: UnsafePointer<UInt8>) -> String in
            let buffer = UnsafeBufferPointer(start: bytes, count: self.count)
            return buffer.map{String(format: "%02hhx", $0)}.reduce("", {$0 + $1})
        })
    }
}

HexString转Data

extension String {
    
    /// Create `Data` from hexadecimal string representation
    ///
    /// This takes a hexadecimal representation and creates a `Data` object. Note, if the string has any spaces or non-hex characters (e.g. starts with '<' and with a '>'), those are ignored and only hex characters are processed.
    ///
    /// - returns: Data represented by this hexadecimal string.
    
    func hexadecimal() -> Data? {
        var data = Data(capacity: characters.count / 2)
        let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
        regex.enumerateMatches(in: self, range: NSMakeRange(0, utf16.count)) { match, flags, stop in
            let byteString = (self as NSString).substring(with: match!.range)
            var num = UInt8(byteString, radix: 16)!
            data.append(&num, count: 1)
        }
        
        guard data.count > 0 else { return nil }
        
        return data
    }
    
}

hexString与Data互转OC版

+ (NSData *)dataFromHex:(NSString *)hexString {
    
    if (hexString == nil || hexString.length %2 != 0 || hexString.length == 0) return nil;
    NSString *upper = [hexString uppercaseString];
    Byte bytes[hexString.length/2];
    for (int i = 0; i < hexString.length; i=i+2) {
        int high = [self unichar2int:[upper characterAtIndex:i]];
        int low = [self unichar2int:[upper characterAtIndex:i+1]];
        if (high == -1 || low == -1) return nil;
        bytes[i/2] = high * 16 + low;
    }
    return [NSData dataWithBytes:bytes length:hexString.length/2];
}

+ (int)unichar2int:(int)input {
    if (input >= '0' && input <= '9') {
        return input - 48;
    } else if (input >= 'A' && input <= 'F') {
        return input - 55;
    } else {
        return -1;
    }
}

+ (NSString *)hexFromData:(NSData *)data {
    
    if (data == nil) return nil;
    Byte *bytes = (Byte *)data.bytes;
    NSMutableString *str = [NSMutableString string];
    for (int i=0; i<data.length; i++) {
        [str appendFormat:@"%02x",bytes[i]];
    }
    return str;
}

进制转换

extension Int {
    // 10进制转2进制
    var toBinary: String {
        return String(self, radix: 2, uppercase: true)
    }
    // 10进制转16进制
    var toHexa: String {
        return String(self, radix: 16)
    }
}

extension String {
    // 16进制转10进制
    var hexaToDecimal: Int {
        return Int(strtoul(self, nil, 16))
    }
    // 16进制转2进制
    var hexaToBinary: String {
        return hexaToDecimal.toBinary
    }
    // 2进制转10进制
    var binaryToDecimal: Int {
        return Int(strtoul(self, nil, 2))
    }
    // 2进制转16进制
    var binaryToHexa: String {
        return binaryToDecimal.toHexa
    }
}

计算字符串16进制长度

/// 计算字符串16进制长度
    ///
    /// - Parameters:
    ///   - str: 字符串
    ///   - bytes: 计算结果占几个字节
    /// - Returns: 16进制结果
    func calculateStringLenth(str: String, bytes: Int) -> String{
        let length = str.characters.count % 2 == 0 ? str.characters.count / 2 : str.characters.count / 2 + 1
        var hexLength = length.toHexa
        while  hexLength.characters.count / 2 != bytes{
            hexLength = "0" + hexLength
        }
        return hexLength
    }

相关文章

  • Swift与硬件打交道封装的方法

    Data转HexString 或者 HexString转Data hexString与Data互转OC版 进制转换...

  • Swift与硬件打交道封装的方法二

    之前写过一篇Swift与硬件打交道封装的方法[https://www.jianshu.com/p/67d0b010...

  • iOS动画教程 - UIView动画

    Swift国内社区: SwiftMic Swift版本: 4.1 简介 UIView 封装了 animate 方法...

  • swift 基础方法的封装

    CTCateory swift oc 基本类用swift实现 前言 本文主要是针对swift封装基础方法类,方...

  • 记录一下System.loadLibrary和System.lo

    主要是工作和硬件打交道过.而且公司用的JNI.然后dll就在工程根目录很多 想封装一下.那某些库要用的jni封装到...

  • Swift 5.1 (11) - 方法

    方法 方法是与特定类型相关联的函数。Swift中类,结构体和枚举都可以定义实例方法,这些方法封装了用于处理特定类型...

  • Swift复习系列:方法

    在Swift语言中,方法分两种: 实例方法,为给定类型的实例封装 了具体的任务与功能,通过实例对象来调用; 类型方...

  • 数据库:SwiftSQlite

    与sqlite比较 本质:sqlite。SwiftSqlite是swift的封装。类似FMDB是OC的封装。 易于...

  • Swift - 日志

    Swift - 日志框架XCGLogger的使用详解Swift - 实现日志输出的封装1(显示出调用的文件名、方法...

  • Swift笔记<十四>三大特性

    和object-c一样swift的三大特性同为封装,继承,多态 封装 继承 重写方法 重载方法参数名相同,参数个数...

网友评论

      本文标题:Swift与硬件打交道封装的方法

      本文链接:https://www.haomeiwen.com/subject/sepemxtx.html