对于任何(至少整数)数字,是否有任何本机Swift方法可以在字符串中获取其十六进制表示形式?和逆。它不能使用Foundation。例如,String类有一个函数
func toInt() -> Int?
将表示整数的字符串转换为其Int值。我正在寻找类似的东西,使用十六进制字符串。我知道这很容易实现,但如果Swift有它,那就已经好了。否则,如果您已经使用String和Int的扩展来实现以下目的:
let anHex = "0xA0"
if let anInt = anHex.toInt() {
println(anInt) // prints 128
println(anInt.toHexString()) // prints "0xA0"
}
我知道这不是火箭科学,但万一请分享。
PS:这与this question类似,不同之处在于它与Foundation框架非常相关,而我在我的代码中没有使用它(我也没有导入任何其他内容)而且现在我'我希望以这种方式保留它,也用于学习目的。
答案 0 :(得分:76)
从 Swift 2开始,所有整数类型都有一个构造函数
init?(_ text: String, radix: Int = default)
这样两个整数 可以完成十六进制字符串和十六进制字符串到整数转换 内置方法。例如:
let num = 1000
let str = String(num, radix: 16)
print(str) // "3e8"
if let num2 = Int(str, radix: 16) {
print(num2) // 1000
}
(Swift 1的旧答案:)可以使用
完成从整数到十六进制字符串的转换let hex = String(num, radix: 16)
(参见例如How to convert a decimal number to binary in Swift?)。这不需要导入任何框架 适用于2到36之间的任何基础。
可以使用BSD完成从十六进制字符串到整数的转换
库函数strtoul()
(比较How to convert a binary to decimal in Swift?)如果您愿意import Darwin
。
否则(据我所知)没有内置的Swift方法。这是一个扩展 根据给定的基数将字符串转换为数字:
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")
}
答案 1 :(得分:16)
更新: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) }
}
测试:
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)
答案 2 :(得分:16)
String
至UInt
:let str = "fcd7d7"
let number = UInt(str, radix: 16)!
print(number)
结果:16570327
UInt
到十六进制String
:let number = UInt(exactly: 16570327)!
let str = String(number, radix: 16, uppercase: false)
print(str)
结果:fcd7d7
答案 3 :(得分:2)
对于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
或反之亦然
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
}
}