我得到了在Objective-C中将String转换为HEX-String的代码。
- (NSString *) CreateDataWithHexString:(NSString*)inputString { NSUInteger inLength = [inputString length]; unichar *inCharacters = alloca(sizeof(unichar) * inLength); [inputString getCharacters:inCharacters range:NSMakeRange(0, inLength)]; UInt8 *outBytes = malloc(sizeof(UInt8) * ((inLength / 2) + 1)); NSInteger i, o = 0; UInt8 outByte = 0; for (i = 0; i < inLength; i++) { UInt8 c = inCharacters[i]; SInt8 value = -1; if (c >= '0' && c <= '9') value = (c - '0'); else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A'); else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a'); if (value >= 0) { if (i % 2 == 1) { outBytes[o++] = (outByte << 4) | value; outByte = 0; } else { outByte = value; } } else { if (o != 0) break; } } NSData *a = [[NSData alloc] initWithBytesNoCopy:outBytes length:o freeWhenDone:YES]; NSString* newStr = [NSString stringWithUTF8String:[a bytes]]; return newStr; }
我想要在Swift中也一样。任何人都可以在Swift中翻译此代码,或者在Swift中有任何简单的方法吗?
这是我的Data例行十六进制字符串:
Data
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 } }
为了完整起见,这是我Data的十六进制字符串例程:
extension Data { /// Hexadecimal string representation of `Data` object. var hexadecimal: String { return map { String(format: "%02x", $0) } .joined() } }
请注意,如上所示,我通常只在十六进制表示形式和NSData实例之间进行转换(因为如果可以将信息表示为字符串,则可能一开始就不会创建十六进制表示形式)。但是您最初的问题是要在十六进制表示形式和String对象之间进行转换,因此可能看起来像这样:
NSData
String
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 } }
然后可以像上面这样使用上面的代码:
let hexString = "68656c6c 6f2c2077 6f726c64" print(String(hexadecimal: hexString))
要么,
let originalString = "hello, world" print(originalString.hexadecimalString())
有关上述对早期Swift版本的排列,请参阅此问题的修订历史记录。