Converting Hex String to NSData in Swift

后端 未结 11 1275
一生所求
一生所求 2020-11-27 05:22

I got the code to convert String to HEX-String in objective-C.

- (NSString *) CreateDataWithHexString:(NSString*)inputString
{
NSUInteger inLength = [inputSt         


        
11条回答
  •  长情又很酷
    2020-11-27 05:42

    This is my hex string to Data routine:

    extension String {
    
        /// Create `Data` from hexadecimal string representation
        ///
        /// This creates a `Data` object from hex string. 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.
    
        var 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: NSRange(startIndex..., in: self)) { match, _, _ in
                let byteString = (self as NSString).substring(with: match!.range)
                let num = UInt8(byteString, radix: 16)!
                data.append(num)
            }
    
            guard data.count > 0 else { return nil }
    
            return data
        }
    
    }
    

    And for the sake of completeness, this is my Data to hex string routine:

    extension Data {
    
        /// Hexadecimal string representation of `Data` object.
    
        var hexadecimal: String {
            return map { String(format: "%02x", $0) }
                .joined()
        }
    }
    

    Note, as shown in the above, I generally only convert between hexadecimal representations and NSData instances (because if the information could have been represented as a string you probably wouldn't have created a hexadecimal representation in the first place). But your original question wanted to convert between hexadecimal representations and String objects, and that might look like so:

    extension String {
    
        /// Create `String` representation of `Data` created from hexadecimal string representation
        ///
        /// This takes a hexadecimal representation and creates a String object from that. Note, if the string has any spaces, those are removed. Also if the string started with a `<` or ended with a `>`, those are removed, too.
        ///
        /// For example,
        ///
        ///     String(hexadecimal: "<666f6f>")
        ///
        /// is
        ///
        ///     Optional("foo")
        ///
        /// - returns: `String` represented by this hexadecimal string.
    
        init?(hexadecimal string: String, encoding: String.Encoding = .utf8) {
            guard let data = string.hexadecimal() else {
                return nil
            }
    
            self.init(data: data, encoding: encoding)
        }
    
        /// Create hexadecimal string representation of `String` object.
        ///
        /// For example,
        ///
        ///     "foo".hexadecimalString()
        ///
        /// is
        ///
        ///     Optional("666f6f")
        ///
        /// - parameter encoding: The `String.Encoding` that indicates how the string should be converted to `Data` before performing the hexadecimal conversion.
        ///
        /// - returns: `String` representation of this String object.
    
        func hexadecimalString(encoding: String.Encoding = .utf8) -> String? {
            return data(using: encoding)?
                .hexadecimal
        }
    
    }
    

    You could then use the above like so:

    let hexString = "68656c6c 6f2c2077 6f726c64"
    print(String(hexadecimal: hexString))
    

    Or,

    let originalString = "hello, world"
    print(originalString.hexadecimalString())
    

    For permutations of the above for earlier Swift versions, see the revision history of this question.

提交回复
热议问题