如何在 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。使用 String
的 init(_: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。使用 String
的 init(format:_:)
初始化器
Foundation
提供 String
一个 init(format:_:)
初始化程序。 init(format:_:)
有以下声明:
init(format: String, _ arguments: CVarArg...)
返回一个
String
对象,该对象使用给定的格式字符串作为模板进行初始化,其余参数值将被替换到该模板中。
Apple 的字符串编程指南 提供了String
和NSString
支持的格式说明符列表。在这些格式说明符中,%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。使用 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"
【讨论】:
【参考方案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
时才有效(这包括Cocoa
或UIKit
的导入)。如果您在进行 ios 或 macOS 编程,这不是问题。
如果需要A...F
,请使用大写X
,如果需要a...f
,请使用小写x
:
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"
【讨论】:
“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)
【讨论】:
请添加代码以将十六进制转换回十进制。 @VarunNahariaInt("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 中将十六进制字符串转换为 CString?
如何在 Swift 2.0 中将 HKQuanity 转换为 Int