如何将 Int 转换为十六进制字符串?

问题描述 投票:0回答:7

在 Objective-C 中,我曾经使用以下方法将无符号整数转换为十六进制字符串:

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

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

swift string hex
7个回答
181
投票

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

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
)。如果您正在进行 iOSmacOS 编程,这不是问题。

如果您想要

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"

62
投票

在 Swift 中,

init
上有一个特定的
String
方法来实现这一点:

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

55
投票

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


#1。使用
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"

#2。使用
String
init(format:​_:​)
初始化器

Foundation
提供
String
init(format:​_:​)
初始值设定项。
init(format:​_:​)
有以下声明:

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

返回一个

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

Apple 的 字符串编程指南 提供了

String
NSString
支持的格式说明符列表。在这些格式说明符中,
%X
具有以下描述

无符号 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。使用
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"

7
投票

斯威夫特5.2.4

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

3
投票

上面的答案对于 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)
    

2
投票
使用方法

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

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


-1
投票
用这个

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) } }
它适合我

© www.soinside.com 2019 - 2024. All rights reserved.