如何在Swift中将Int转换为hexstring

在Obj-C中,我用无符号整数n转换为hexstring

NSString *st = [NSString stringWithFormat:@"%2X", n]; 

我试了很长时间把它翻译成Swift语言,但是没有成功。

你现在可以做:

 let n = 123 var st = String(format:"%2X", n) st += " is the hexadecimal representation of \(n)" // "7B is the hexadecimal representation of 123" 

这只有在您导入了Foundation (这包括导入CocoaUIKit )时才有效。 如果您正在进行iOSOS X编程,这不是问题。

如果你想A...F和小写的x如果你想要a...f大写的X a...f

 String(format: "%x %X", 64206, 64206) // "face FACE" 

原始答复

你仍然可以使用NSString来做到这一点。 格式是:

 var st = NSString(format:"%2X", n) 

这使得一个NSString ,所以然后像+=东西不工作。 如果你想把+= make st的string追加到string中,如下所示:

 var st = NSString(format:"%2X", n) as String 

要么

 var st = String(NSString(format:"%2X", n)) 

要么

 var st: String = NSString(format:"%2X", n) 

那你可以这样做:

 let n = 123 var st = NSString(format:"%2X", n) as String st += " is the hexadecimal representation of \(n)" // "7B is the hexadecimal representation of 123" 

在Swift中,对于String有一个特定的init方法:

 let hex = String(0xF, radix: 16, uppercase: false) println("hex=\(hex)") // Output: f 

用Swift 3,根据你的需要,你可以select以下三种方法之一来解决你的问题。


#1。 使用Stringinit(_:radix:uppercase:)初始值设定项

Swift String有一个init(_:radix:uppercase:)初始值设定项,声明如下:

 init<T>(_ value: T, radix: Int = default, uppercase: Bool = default) where T : _SignedInteger 

创build一个表示以10为底的给定值的string,或者其他指定的基数。

下面的Playground代码展示了如何使用init(_:radix:uppercase:)创build一个以hex格式表示整数值的String实例,而无需导入Foundation

 let string1 = String(2, radix: 16) print(string1) // prints: "2" let string2 = String(211, radix: 16) print(string2) // prints: "d3" let string3 = String(211, radix: 16, uppercase: true) print(string3) // prints: "D3" 

#2。 使用Stringinit(format:​_:​)初始值设定项

FoundationString提供了一个init(format:​_:​)初始值设定项。 init(format:​_:​)具有以下声明:

 init(format: String, _ arguments: CVarArg...) 

返回一个String对象,它使用给定的格式string作为模板,其余的参数值被replace。

Apple的String编程指南给出了StringNSString支持的格式说明符列表。 在这些格式说明符中, %X具有以下说明 :

无符号32位整数( unsigned int ),使用数字0-9和大写字母A-F以hex打印。

下面的Playground代码显示了如何使用init(format:​_:​)创build一个以hex格式表示整数值的String实例:

 import Foundation let string1 = String(format:"%X", 2) print(string1) // prints: "2" let string2 = String(format:"%02X", 1) print(string2) // prints: "01" let string3 = String(format:"%02X", 211) print(string3) // prints: "D3" let string4 = String(format: "%02X, %02X, %02X", 12, 121, 255) print(string4) // prints: "0C, 79, FF" 

#3。 使用Stringinit(format:​arguments:​) :)初始值设定项

Foundation提供了一个String init(format:​arguments:​) :)初始值设定项。 init(format:​arguments:​)具有以下声明:

 init(format: String, arguments: [CVarArg]) 

返回通过使用给定的格式string作为模板初始化的String对象,根据用户的默认语言环境将其余参数值replace为该模板。

下面的Playground代码展示了如何使用init(format:​arguments:​)创build一个以hex格式表示整数值的String实例:

 import Foundation let string1 = String(format:"%X", arguments: [2]) print(string1) // prints: "2" let string2 = String(format:"%02X", arguments: [1]) print(string2) // prints: "01" let string3 = String(format:"%02X", arguments: [211]) print(string3) // prints: "D3" let string4 = String(format: "%02X, %02X, %02X", arguments: [12, 121, 255]) print(string4) // prints: "0C, 79, FF" 

使用

 let string2 = String(format:"%02X", 1) print(string2) // prints: "01" 

在Swift3中不需要导入基础,至less不在一个Project中。 string应该具有作为NSString的所有function。

上面的解决scheme在32位Int的值范围内工作正常,但是值超过这个值将不会工作,因为值会翻转。

对于大于32位Int的值,您需要使用长度修饰符

%x =无符号32位整数(无符号整数)

ll =长度修饰符,指定后面的d,o,u,x或X转换说明符适用于long long或unsigned long long参数。

 let hexString = String(format:"%llX", decimalValue)