如何将数据转换为hexstring在迅速

我想在Swift中的Data值的hex表示。

最终我想要这样使用它:

let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")! print(data.hexString) 

一个替代的实现(从如何将string隐藏到使用Swift的sha1? )将是

 extension Data { func hexEncodedString() -> String { return map { String(format: "%02hhx", $0) }.joined() } } 

我以现有方法base64EncodedString()的样式select了一个hexEncodedString()方法。

Data符合Collection协议,因此可以使用map()将每个字节映射到相应的hexstring。 %02x格式打印基数为16的参数,如有必要,最多填写两位数字,前导零。 hh修饰符会导致参数(作为整数在堆栈中传递)被视为一个字节的数量。 我们可以在这里省略修饰符,因为$0是一个无符号数( UInt8 ),不会出现任何符号扩展,但是不会产生任何损害。

结果然后连接到一个单一的string。

例:

 let data = Data(bytes: [0, 1, 127, 128, 255]) print(data.hexEncodedString()) // 00017f80ff 

此代码扩展了具有计算属性的Datatypes。 它遍历数据的字节并将字节的hex表示连接到结果:

 extension Data { var hexDescription: String { return reduce("") {$0 + String(format: "%02x", $1)} } } 

这并没有真正回答OP的问题,因为它工作在Swift字节数组上,而不是Data对象。 而且比其他答案要大得多。 但它应该更有效,因为它避免使用String(format:)。

无论如何,希望有人认为这有用…

 public class StringMisc { // MARK: - Constants // This is used by the byteArrayToHexString() method private static let CHexLookup : [Character] = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" ] // Mark: - Public methods /// Method to convert a byte array into a string containing hex characters, without any /// additional formatting. public static func byteArrayToHexString(_ byteArray : [UInt8]) -> String { var stringToReturn = "" for oneByte in byteArray { let asInt = Int(oneByte) stringToReturn.append(StringMisc.CHexLookup[asInt >> 4]) stringToReturn.append(StringMisc.CHexLookup[asInt & 0x0f]) } return stringToReturn } } 

testing用例:

  // Test the byteArrayToHexString() method let byteArray : [UInt8] = [ 0x25, 0x99, 0xf3 ] assert(StringMisc.byteArrayToHexString(byteArray) == "2599F3") 
 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" dateFormatter.locale = Locale(identifier: "en") let timeStamp = dateFormatter.string(from:Date()) let currentdate = dateFormatter.date(from: timeStamp) let offset = (TimeZone.current.secondsFromGMT()) print(currentdate) let a = Int((currentdate?.millisecondsSince1970)! + offset) let st = String(format:"%2X",a)