Swift本机函数将数字作为十六进制字符串

时间:2014-11-28 13:06:08

标签: ios macos swift numbers hex

对于任何(至少整数)数字,是否有任何本机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框架非常相关,而我在我的代码中没有使用它(我也没有导入任何其他内容)而且现在我'我希望以这种方式保留它,也用于学习目的。

4 个答案:

答案 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)

Swift 3

StringUInt

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
 }
}