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
Swift native functions to have numbers as hex strings
提问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:
String
to UInt
:
String
到UInt
:
let str = "fcd7d7"
let number = UInt(str, radix: 16)!
print(number)
result: 16570327
结果: 16570327
UInt
to 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
}
}