美文网首页
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与硬件打交道封装的方法

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