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

Posted

技术标签:

【中文标题】如何在 Swift 中将 Int 转换为十六进制字符串【英文标题】:How to convert an Int to Hex String in Swift 【发布时间】:2014-08-05 10:34:43 【问题描述】:

在 Obj-C 中,我曾经使用

将无符号整数 n 转换为十六进制字符串
 NSString *st = [NSString stringWithFormat:@"%2X", n];

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

【问题讨论】:

根据***.com/users/1187415/martin-r这里***.com/questions/24986319/…的回答,你可以做到String s = "0x" + String(n, radix: 16) 【参考方案1】:

斯威夫特 5.2.4

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

【讨论】:

【参考方案2】:

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


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

Swift String 有一个 init(_:radix:uppercase:) 初始化器,其声明如下:

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

创建一个字符串,表示以 10 为基数的给定值,或其他一些指定的基数。

下面的 Playground 代码展示了如何使用 init(_:radix:uppercase:) 创建一个以十六进制格式表示整数值的 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:​_:​) 初始化器

Foundation 提供 String 一个 init(format:​_:​) 初始化程序。 init(format:​_:​) 有以下声明:

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

返回一个String 对象,该对象使用给定的格式字符串作为模板进行初始化,其余参数值将被替换到该模板中。

Apple 的字符串编程指南 提供了StringNSString 支持的格式说明符列表。在这些格式说明符中,%X 有以下description:

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

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

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 对象,该对象使用给定的格式字符串作为模板进行初始化,其余参数值将根据用户的默认语言环境替换到该模板中。

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

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"

【讨论】:

【参考方案3】:

您现在可以这样做:

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

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

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

如果需要A...F,请使用大写X,如果需要a...f,请使用小写x

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

如果要打印大于UInt32.max 的整数值,请将llel-el,而不是eleven)添加到格式字符串中:

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

原答案

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

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

这使得st 成为NSString,所以像+= 这样的东西不起作用。如果您希望能够使用+=st 附加到字符串,则将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"

【讨论】:

“7B是十六进制的123”中的十六进制和十进制数颠倒了,所以st表达式应该更正为:st = "(n) is " + String(format:"%2X" ,n) + " 十六进制" @KevinSliech,我承认这是模棱两可的。我的意思是,好像有人上前问“7B 代表什么?”,你会回答“7B 是用十六进制写的数字 123”。 我觉得这两个都有点模棱两可,尤其是现在我已经阅读了大约 1000 次。另一种方法是写:“0x7B = 123d”或类似的东西。这种模棱两可可能会使不熟悉交替数字系统的人感到困惑。 @KevinSliech,谢谢。我把声明说得更清楚了。 在 Swift4 中,如果您想在必要时以“0”开头,则必须使用“%02X”而不是“%2X”(“%2X”插入一个空格)【参考方案4】:

上述答案适用于 32 位 Int 范围内的值,但超过此范围的值将不起作用,因为该值将翻转。

对于大于 32 位 Int 的值,您需要使用 length modifier

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

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

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

【讨论】:

请添加代码以将十六进制转换回十进制。 @VarunNaharia Int("hexaString", radix: 16)【参考方案5】:

使用

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

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

【讨论】:

【参考方案6】:

在 Swift 中,String 上有一个特定的 init 方法,用于此目的:

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

【讨论】:

如何将此字符串转换为 UInt? 您想将"0xF" 转换为UInt let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), number 将是 UInt? 类型如果您需要更多提问:) 可能:String(0xf, radix: 0x10, uppercase: false) @Rich 我们在Objective C中有NSString的基数方法吗?

以上是关于如何在 Swift 中将 Int 转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 Int 转换为字符

如何在 Swift 中将十六进制字符串转换为 CString?

在 Swift 中将 Int 转换为 String

如何在 Swift 2.0 中将 HKQuanity 转换为 Int

如何在 Swift 2.0 中将 HKQuanity 转换为 Int

在 Swift 3 中将 String 转换为 int