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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27189338/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 03:49:37  来源:igfitidea点击:

Swift native functions to have numbers as hex strings

iosmacosswiftnumbershex

提问by Michele Dall'Agata

Is there any native Swift way for any (at least integer) number to get its hexadecimal representation in a string? And the inverse. It must not use Foundation. For example the String class has a function

对于任何(至少是整数)数字,是否有任何原生的 Swift 方法可以在字符串中获取其十六进制表示?而相反。它不得使用 Foundation。例如 String 类有一个函数

func toInt() -> Int?

which converts a string representing an integer to its Int value. I am looking for something similar, using the hex strings. I know this is easily implementable, but if Swift has it there already it would be better. Otherwise if you made already an extension of String and Int to achieve the following:

它将表示整数的字符串转换为其 Int 值。我正在寻找类似的东西,使用十六进制字符串。我知道这很容易实现,但如果 Swift 已经有了它会更好。否则,如果您已经对 String 和 Int 进行了扩展以实现以下目标:

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

I know it isn't rocket science but in case please share it.

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

PS: This is similar to this question, the difference is that it was very related to the Foundation framework, while I am not using it in my code (nor I am importing anything else) and for now I'd like to keep it in this way, also for learning purposes.

PS:这与this question类似,不同之处在于它与Foundation框架非常相关,而我没有在我的代码中使用它(也没有导入任何其他东西),现在我想保留它这样,也用于学习目的。

回答by Martin R

As of Swift 2,all integer types have a constructor

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

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

so that both integer to hex string and hex string to integer conversions can be done with built-in methods. Example:

这样整数到十六进制字符串和十六进制字符串到整数的转换都可以使用内置方法完成。例子:

let num = 1000
let str = String(num, radix: 16)
print(str) // "3e8"

if let num2 = Int(str, radix: 16) {
    print(num2) // 1000
}


(Old answer for Swift 1:)The conversion from an integer to a hex string can be done with

(Swift 1 的旧答案:)可以使用以下方法完成从整数到十六进制字符串的转换

let hex = String(num, radix: 16)

(see for example How to convert a decimal number to binary in Swift?). This does not require the import of any Framework and works with any base between 2 and 36.

(参见例如如何在 Swift 中将十进制数转换为二进制数?)。这不需要导入任何框架并且适用于 2 到 36 之间的任何基数。

The conversion from a hex string to an integer can be done with the BSD library function strtoul()(compare How to convert a binary to decimal in Swift?) if you are willing to import Darwin.

如果您愿意,可以使用 BSD 库函数strtoul()(比较如何在 Swift 中将二进制转换为十进制?)完成从十六进制字符串到整数的转换import Darwin

Otherwise there is (as far as I know) no built-in Swift method. Here is an extension that converts a string to a number according to a given base:

否则(据我所知)没有内置的 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
    }
}

Example:

例子:

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

回答by Ali Momen Sani

Swift 3:

斯威夫特 3

Stringto UInt:

StringUInt

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

result: 16570327

结果: 16570327

UIntto hex String:

UInt到十六进制String

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

result: fcd7d7

结果: fcd7d7

回答by Leo Dabus

update: Xcode 7.2 ? Swift 2.1.1

更新:Xcode 7.2?斯威夫特 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)

回答by Kraming

For Float, If you might want IEEE754 floating point to HEX

对于浮点数,如果您可能想要 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

Or Visa-versa

或者反之亦然

extension String {

 func hexToFloat() -> Float {
    var toInt = Int32(truncatingBitPattern: strtol(self, nil, 16))
    var toInt = Int32(_truncatingBits: strtoul(self, nil, 16)) //For Swift 5
    var float:Float32!
    memcpy(&float, &toInt, MemoryLayout.size(ofValue: float))
    return float
 }
}