Swift原生函数将数字作为hexstring

是否有任何(至less整数)数字获取其hex表示的string的本机Swift方式? 和逆。 它不能使用基金会。 例如,String类有一个函数

func toInt() -> Int? 

它将表示一个整数的string转换为它的Int值。 我正在寻找类似的东西,使用hexstring。 我知道这很容易实现,但如果Swift已经有了,那就更好了。 否则,如果你已经做了一个String和Int的扩展来实现以下function:

 let anHex = "0xA0" if let anInt = anHex.toInt() { println(anInt) // prints 128 println(anInt.toHexString()) // prints "0xA0" } 

我知道这不是火箭科学,但是万一请分享。

PS:这个和这个问题类似,区别在于它和Foundation框架非常相关,而我没有在代码中使用它(也没有导入任何东西),现在我想保留它这样,也是为了学习的目的。

Swift 2开始,所有的整型都有一个构造函数

 init?(_ text: String, radix: Int = default) 

所以整数到hexstring和hexstring到整数转换都可以使用内置方法完成。 例:

 let num = 1000 let str = String(num, radix: 16) print(str) // "3e8" if let num2 = Int(str, radix: 16) { print(num2) // 1000 } 

(Swift 1的老答案:)可以用一个整数转换为hexstring

 let hex = String(num, radix: 16) 

(请参阅示例如何将十进制数转换为二进制Swift中? )。 这不需要导入任何框架,并且可以在2到36之间的任何基础上工作。

从hexstring到整数的转换可以用BSD库函数strtoul()来完成(比较如何将二进制转换为十进制在Swift? )如果你愿意import Darwin

否则有(据我所知)没有内置的Swift方法。 这里是一个扩展,根据给定的基础将string转换为数字:

 extension UInt { init?(_ string: String, radix: UInt) { let digits = "0123456789abcdefghijklmnopqrstuvwxyz" var result = UInt(0) for digit in string.lowercaseString { if let range = digits.rangeOfString(String(digit)) { let val = UInt(distance(digits.startIndex, range.startIndex)) if val >= radix { return nil } result = result * radix + val } else { return nil } } self = result } } 

例:

 let hexString = "A0" if let num = UInt(hexString, radix: 16) { println(num) } else { println("invalid input") } 

更新:Xcode 7.2•Swift 2.1.1

 extension String { var drop0xPrefix: String { return hasPrefix("0x") ? String(characters.dropFirst(2)) : self } var drop0bPrefix: String { return hasPrefix("0b") ? String(characters.dropFirst(2)) : self } var hexaToDecimal: Int { return Int(drop0xPrefix, radix: 16) ?? 0 } var hexaToBinaryString: String { return String(hexaToDecimal, radix: 2) } var decimalToHexaString: String { return String(Int(self) ?? 0, radix: 16) } var decimalToBinaryString: String { return String(Int(self) ?? 0, radix: 2) } var binaryToDecimal: Int { return Int(drop0bPrefix, radix: 2) ?? 0 } var binaryToHexaString: String { return String(binaryToDecimal, radix: 16) } } extension Int { var toBinaryString: String { return String(self, radix: 2) } var toHexaString: String { return String(self, radix: 16) } } 

testing:

 print("7fffffffffffffff".hexaToDecimal) // "9223372036854775807" decimal integer print("0x7fffffffffffffff".hexaToDecimal) // "9223372036854775807" decimal integer print("7fffffffffffffff".hexaToBinaryString) // "111111111111111111111111111111111111111111111111111111111111111" binary (String) print("0x7fffffffffffffff".hexaToBinaryString) // "111111111111111111111111111111111111111111111111111111111111111" print("255".decimalToHexaString) // "ff" hexa (String) print("255".decimalToBinaryString) // "11111111" binary (String) 0b11111111 print("11111111".binaryToHexaString) // "ff" hexa (String) print("0b11111111".binaryToHexaString) // "ff" hexa (String) print("11111111".binaryToDecimal) // 255 decimal (Int) print("0b11111111".binaryToDecimal) // 255 decimal (Int) print(255.toBinaryString) // "11111111" binary (String) print(255.toHexaString) // "ff" hexadecimal (String) 

Swift 3

StringUInt

 let str = "fcd7d7" let number = UInt(str, radix: 16)! print(number) 

结果: 16570327

UInt到hexString

 let number = UInt(exactly: 16570327)! let str = String(number, radix: 16, uppercase: false) print(str) 

结果: fcd7d7

对于Float,如果你想要IEEE754浮点数为HEX

 extension Float { func floatToHex()->String { return String(self.bitPattern, radix: 16, uppercase: true) } } let f:Float = 3.685746e+19 let hex = f.floatToHex() print("\(hex)")//5FFFC000 

或者也可以是Visa

 extension String { func hexToFloat() -> Float { var toInt = Int32(truncatingBitPattern: strtol(self, nil, 16)) var float:Float32! memcpy(&float, &toInt, MemoryLayout.size(ofValue: float)) return float } }