(iOS, Swift)十六进制字符串转(Hex)Data,Data转十六进制String Data,NSData,bytes[UInt8]互转

这篇博客详细介绍了在Swift中如何进行十六进制字符串与Data及bytes数组之间的转换。提供了两种方法将十六进制字符串转换为Data,以及将Data和bytes数组转换为十六进制字符串的实现。此外,还展示了如何将bytes数组转换为mac地址格式的字符串,并提到了CryptoSwift框架作为另一种转换选择。同时,文章给出了Data转十六进制String的代码,并讨论了Data、NSData和bytes[UInt8]之间的互转操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.十六进制String(字符串)转Data

1.1 方法一(推荐):

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: self.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
    }

}

1.2 方法二:

 //将十六进制字符串转化为 Data
    func data(from hexStr: String) -> Data {
        var hexStr1 = ""
        if hexStr.count % 2 != 0 {
            hexStr1 = "0" + hexStr
        }else {
            hexStr1 = hexStr
        }
        let bytes = self.bytes(from: hexStr1)
        return Data(bytes: bytes)
    }

   

2.十六进制字符串转bytes[UInt8]

 // 将16进制字符串转化为 [UInt8]
    // 使用的时候直接初始化出 Data
    // Data(bytes: Array<UInt8>)
   func bytes(from hexStr: String) -> [UInt8] {
//        print("hexStr:\(hexStr)")
        assert(hexStr.count % 2 == 0, "输入字符串格式不对,8位代表一个字符")
        var bytes = [UInt8]()
        var sum = 0
        // 整形的 utf8 编码范围
        let intRange = 48...57
        // 小写 a~f 的 utf8 的编码范围
        let lowercaseRange = 97...102
        // 大写 A~F 的 utf8 的编码范围
        let uppercasedRange = 65...70
        for (index, c) in hexStr.utf8CString.enumerated() {
            var intC = Int(c.byteSwapped)
            if intC == 0 {
                break
            } else if intRange.contains(intC) {
                intC -= 48
            } else if lowercaseRange.contains(intC) {
                intC -= 87
            } else if uppercasedRange.contains(intC) {
                intC -= 55
            } else {
                assertionFailure("输入字符串格式不对,每个字符都需要在0~9,a~f,A~F内")
            }
            sum = sum * 16 + intC
            // 每两个十六进制字母代表8位,即一个字节
            if index % 2 != 0 {
                bytes.append(UInt8(sum))
                sum = 0
            }
        }
//    print(bytes)
    print(bytes.count)
        return bytes
    }

3.bytes[UInt8]转十六进制字符串Hex

3.1 自己的代码和示例

示例

       let bytes:[UInt8] = [0xff,0xaa,0xbb]
        print(bytes)
        print(bytes.toHexStr())

打印结果:
[255, 170, 187]
ff-aa-bb

代码

extension Data {
//MARK: Data转十六进制字符串
    /// Create hexadecimal string representation of `Data` object.
    ///
    /// - returns: `String` representation of this `Data` object.

    func hexadecimal() -> String {
        return map { String(format: "%02x", $0) }
            .joined(separator: "-")
    }
}

extension Array where Element == UInt8 {
//MARK: bytes[UInt8]转十六进制字符串
    /// Create hexadecimal string representation of `Data` object.
    ///
    /// - returns: `String` representation of this `Data` object.

    func toHexStr() -> String {
        let data:Data = Data.init(bytes: self)
        return data.hexadecimal()
    }
}

3.2 bytes[UInt8],Data,NSData转十六进制字符串,mac地址“AA:BB:CC:DD:EE:FF”

extension NSData {
    func macStr()->String {
        var bytes:[UInt8] = [UInt8](self as Data)
        bytes.removeFirst()
        bytes.removeFirst()
        var macStr = bytes.toHexStr()
        return macStr.uppercased()
    }
}

extension Data {

    /// Create hexadecimal string representation of `Data` object.
    ///
    /// - returns: `String` representation of this `Data` object.

    func macStr() -> String {
        return map { String(format: "%02x", $0) }
            .joined(separator: ":")
    }
}



extension Array where Element == UInt8 {
//MARK: bytes[UInt8]转十六进制字符串
    /// Create hexadecimal string representation of `Data` object.
    ///
    /// - returns: `String` representation of this `Data` object.

    func toHexStr() -> String {
        let data:Data = Data.init(bytes: self)
        return data.macStr()
    }
}

3.2 可以用CryptoSwift框架中的数据转换方法

数据加密和转换的框架:
CryptoSwift - github

请添加图片描述

4.Data转十六进制String

extension Data {

    /// Create hexadecimal string representation of `Data` object.
    ///
    /// - returns: `String` representation of this `Data` object.

    func hexadecimal() -> String {
        return map { String(format: "%02x", $0) }
            .joined(separator: "")
    }
}

5.Data,NSData,bytes[UInt8]互转

playground
在这里插入图片描述

bytes: [UInt8]

let data:Data = Data.init(bytes: bytes);         
let nsdata:NSData = NSData.init(bytes: bytes, length: bytes.count);

data: Data

let bytes: [UInt8] = [UInt8](data)  
let nsdata: NSData = NSData(data: data)

nsdata: NSData

let bytes: [UInt8] = [UInt8](nsdata as Data)
let data: Data = nsdata as Data

参考博客:

(iOS, Swift)十六进制转Data,十六进制转整形,Data转String
swift 16进制String和Data相互转换
Swift中,把NSData转换为Byte数组的三种方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值