关于ios:如何在Swift中将Int转换为十六进制字符串

How to convert an Int to Hex String in Swift

在Obj-C中,我曾使用以下命令将无符号整数n转换为十六进制字符串:

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

我花了很长时间尝试将其翻译成Swift语言,但未成功。


您现在可以执行以下操作:

1
2
3
4
let n = 14
var st = String(format:"%02X", n)
st +=" is the hexadecimal representation of \\(n)"
print(st)
1
0E is the hexadecimal representation of 14

注意:本例中的2是字段宽度,代表所需的最小长度。 0告诉它在必要时用前导0填充结果。 (没有0,结果将用前导空格填充)。当然,如果结果大于两个字符,则字段长度将不会被裁剪为宽度2;它将扩展到显示完整结果所需的任何长度。

这仅在导入了Foundation的情况下才有效(包括CocoaUIKit的导入)。如果您正在执行iOS或macOS编程,这不是问题。

如果要使用A...F,请使用大写字母X;如果要使用A...F,请使用小写字母X

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

如果要打印大于UInt32.max的整数值,请在格式字符串中添加ll(el-el,不是11):

1
2
let n = UInt64.max
print(String(format:"%llX is hexadecimal for \\(n)", n))

1
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615

原始答案

您仍然可以使用NSString来执行此操作。格式为:

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

这使st成为NSString,因此+=之类的东西不起作用。如果希望能够使用+=附加到字符串,则将st设置为String,如下所示:

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

要么

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

要么

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

然后,您可以执行以下操作:

1
2
3
4
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方法用于此目的:

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


使用Swift 5,可以根据需要选择以下三种方法之一来解决问题。

#1。使用Stringinit(_:radix:uppercase:)初始化程序

Swift String具有init(_:radix:uppercase:)初始化程序,并带有以下声明:

1
init< T >(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger

Creates a string representing the given value in base 10, or some other specified base.

下面的Playground代码显示了如何使用init(_:radix:uppercase:)创建一个以十六进制格式表示整数值的String实例,而不必导入Foundation

1
2
3
4
5
6
7
8
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:?_:?)具有以下声明:

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

Returns a String object initialized by using a given format string as a template into which the remaining argument values are substituted.

《 Apple的String编程指南》列出了StringNSString支持的格式说明符。在那些格式说明符中,%X具有以下描述:

Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and uppercase A–F.

下面的Playground代码显示了如何创建String实例,该实例用init(format:?_:?)表示十六进制格式的整数值:

1
2
3
4
5
6
7
8
9
10
11
12
13
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:?)初始化程序

FoundationString提供init(format:?arguments:?)初始化程序。 init(format:?arguments:?)具有以下声明:

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

Returns a String object initialized by using a given format string as a template into which the remaining argument values are substituted according to the user’s default locale.

下面的Playground代码显示了如何创建String实例,该实例用init(format:?arguments:?)表示十六进制格式的整数值:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"

使用

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

在Swift3中,不需要导入基础,至少在Project中不需要。
String应该具有NSString的所有功能。


以上答案对于32位Int范围内的值均适用,但超过此值的值将无效,因为该值将翻转。

您需要将length修饰符用于大于32bit Int的值

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

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

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


斯威夫特5.2.4

1
2
let value = 200
let hexString = String(format:"%02X", value)