在 Objective-C 中,我曾经使用以下方法将无符号整数转换为十六进制字符串:
NSString *st = [NSString stringWithFormat:@"%2X", n];
我尝试了很长时间将其翻译成 Swift 但没有成功。
您现在可以执行以下操作:
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
时才有效(这包括导入 Cocoa
或 UIKit
)。如果您正在进行 iOS 或 macOS 编程,这不是问题。
如果您想要
X
,请使用大写 A...F
;如果您想要 x
,请使用小写 a...f
:
String(format: "%x %X", 64206, 64206) // "face FACE"
如果要打印大于
UInt32.max
的整数值,请将 ll
(el-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"
在 Swift 中,
init
上有一个特定的 String
方法来实现这一点:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
使用 Swift 5,根据您的需要,您可以选择以下三种方法之一来解决您的问题。
String
的 init(_:radix:uppercase:)
初始化器Swift
String
有一个 init(_:radix:uppercase:)
初始值设定项,其声明如下:
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
创建一个以 10 为基数或其他指定基数表示给定值的字符串。
下面的 Playground 代码展示了如何使用
String
创建一个 init(_:radix:uppercase:)
实例来表示十六进制格式的整数值,而无需导入 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"
String
的 init(format:_:)
初始化器Foundation
提供 String
init(format:_:)
初始值设定项。 init(format:_:)
有以下声明:
init(format: String, _ arguments: CVarArg...)
返回一个
对象,该对象使用给定的格式字符串作为模板进行初始化,其余参数值将替换到该模板中。String
Apple 的 字符串编程指南 提供了
String
和 NSString
支持的格式说明符列表。在这些格式说明符中,%X
具有以下描述:
无符号 32 位整数 (
),使用数字 0–9 和大写 A–F 以十六进制打印。unsigned int
下面的 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"
String
的 init(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"
斯威夫特5.2.4
let value = 200
let hexString = String(format: "%02X", value)
上面的答案对于 32 位 Int 范围内的值来说效果很好,但是超过这个值的值将不起作用,因为该值会翻转。
对于大于 32 位 Int 的值,需要使用 length 修饰符
%x = 无符号 32 位整数(unsigned int)ll = 长度修饰符,指定后面的 d、o、u、x 或 X 转换说明符适用于 long long 或 unsigned long long 参数。
let hexString = String(format:"%llX", decimalValue)
let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"
在 Swift3 中不需要导入基础,至少在项目中不需要。 String 应该具有 NSString 的所有功能。
extension Color {
init?(fromInt signedDecimal: Int) {
if signedDecimal == 0 {
self = .clear; return
}
let _input: Int32 = Int32(signedDecimal)
let _inputCastUInt32: UInt32 = UInt32(bitPattern: _input)
let _hexColor_ARGB: String = String(_inputCastUInt32, radix: 16, uppercase: true)
self.init(hex: _hexColor_ARGB)
}
init?(hex: String) {
var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)
hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "")
var rgb: UInt64 = 0
var r: CGFloat = 0.0
var g: CGFloat = 0.0
var b: CGFloat = 0.0
var a: CGFloat = 1.0
let length = hexSanitized.count
guard Scanner(string: hexSanitized).scanHexInt64(&rgb) else { return nil }
if length == 6 {
r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0
g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0
b = CGFloat(rgb & 0x0000FF) / 255.0
} else if length == 8 {
a = CGFloat((rgb & 0xFF000000) >> 24) / 255.0
r = CGFloat((rgb & 0x00FF0000) >> 16) / 255.0
g = CGFloat((rgb & 0x0000FF00) >> 8) / 255.0
b = CGFloat(rgb & 0x000000FF) / 255.0
} else {
return nil
}
self.init(red: r, green: g, blue: b, opacity: a)
}
}
它适合我