简体   繁体   English

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

[英]How to convert an Int to Hex String in Swift

In Obj-C I used to convert an unsigned integer n to a hex string with在 Obj-C 中,我曾经将无符号整数 n 转换为十六进制字符串

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

I tried for a long time to translate this into Swift language, but unsuccessfully.我尝试了很长时间将其翻译成 Swift 语言,但没有成功。

You can now do:你现在可以这样做:

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

Note: The 2 in this example is the field width and represents the minimum length desired.注意:此示例中的2字段宽度,表示所需的最小长度。 The 0 tells it to pad the result with leading 0 's if necessary. 0告诉它在必要时用前导0填充结果。 (Without the 0 , the result would be padded with leading spaces). (没有0 ,结果将用前导空格填充)。 Of course, if the result is larger than two characters, the field length will not be clipped to a width of 2 ;当然,如果结果大于两个字符,则字段长度不会被裁剪为宽度2 it will expand to whatever length is necessary to display the full result.它将扩展到显示完整结果所需的任何长度。

This only works if you have Foundation imported (this includes the import of Cocoa or UIKit ).这仅在您导入Foundation时才有效(这包括CocoaUIKit的导入)。 This isn't a problem if you're doing iOS or macOS programming.如果您在进行iOSmacOS编程,这不是问题。

Use uppercase X if you want A...F and lowercase x if you want a...f :如果你想要A...F使用大写X和小写x如果你想要a...f

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

If you want to print integer values larger than UInt32.max , add ll ( el-el , not eleven ) to the format string:如果要打印大于UInt32.max整数值,请将llel-el ,而不是11 )添加到格式字符串中:

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

Original Answer原答案

You can still use NSString to do this.您仍然可以使用NSString来执行此操作。 The format is:格式为:

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

This makes st an NSString , so then things like += do not work.这使st成为NSString ,因此+=类的东西不起作用。 If you want to be able to append to the string with += make st into a String like this:如果你希望能够追加到带有字符串+=使stString是这样的:

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

or或者

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

or或者

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

Then you can do:然后你可以这样做:

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"

In Swift there is a specific init method on String for exactly this:在 Swift 中, String上有一个特定的init方法:

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

With Swift 5, according to your needs, you may choose one of the three following methods in order to solve your problem.使用 Swift 5,您可以根据需要,选择以下三种方法之一来解决您的问题。


#1. #1. Using String 's init(_:radix:uppercase:) initializer使用Stringinit(_:radix:uppercase:)初始值设定项

Swift String has a init(_:radix:uppercase:) initializer with the following declaration: Swift String有一个带有以下声明的init(_:radix:uppercase:)初始值设定项:

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.创建一个字符串,表示以 10 为基数的给定值,或其他指定的基数。

The Playground code below shows how to create a String instance that represents an integer value in hexadecimal format by using init(_:radix:uppercase:) and without having to import Foundation :下面的 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. #2. Using String 's init(format:​_:​) initializer使用Stringinit(format:​_:​)初始值设定项

Foundation provides String a init(format:​_:​) initializer. FoundationString提供了一个init(format:​_:​)初始化器。 init(format:​_:​) has the following declaration: init(format:​_:​)具有以下声明:

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.返回通过使用给定格式字符串作为模板初始化的String对象,其余参数值将被替换到该模板中。

The Apple's String Programming Guide gives a list of the format specifiers that are supported by String and NSString . Apple 的String Programming Guide提供了StringNSString支持的格式说明符列表。 Among those format specifiers, %X has the following description :在这些格式说明符中, %X具有以下描述

Unsigned 32-bit integer ( unsigned int ), printed in hexadecimal using the digits 0–9 and uppercase A–F.无符号 32 位整数 ( unsigned int ),使用数字 0–9 和大写 A–F 以十六进制打印。

The Playground code below shows how to create a String instance that represents an integer value in hexadecimal format with init(format:​_:​) :下面的 Playground 代码显示了如何使用init(format:​_:​)创建一个表示十六进制格式的整数值的String实例:

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. #3. Using String 's init(format:​arguments:​) initializer使用Stringinit(format:​arguments:​)初始值设定项

Foundation provides String a init(format:​arguments:​) initializer. FoundationString提供了一个init(format:​arguments:​)初始化器。 init(format:​arguments:​) has the following declaration: init(format:​arguments:​)具有以下声明:

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

The Playground code below shows how to create a String instance that represents an integer value in hexadecimal format with init(format:​arguments:​) :下面的 Playground 代码显示了如何使用init(format:​arguments:​)创建一个表示十六进制格式的整数值的String实例:

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"

To use使用

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

In Swift3 import foundation is not required, At least not in a Project.在 Swift3 中不需要导入基础,至少在项目中不需要。 String should have all the functionality as NSString. String 应该具有 NSString 的所有功能。

Answers above work fine for values in the range of a 32 bit Int, but values over this won't work as the value will roll over.上面的答案适用于 32 位 Int 范围内的值,但超过此值的值将不起作用,因为该值将翻转。

You need to use the length modifier for values greater than a 32bit Int您需要对大于 32 位 Int 的值使用长度修饰符

%x = Unsigned 32-bit integer (unsigned int) %x = 无符号 32 位整数(无符号整数)

ll = Length modifiers specifying that a following d, o, u, x, or X conversion specifier applies to a long long or unsigned long long argument. ll = 长度修饰符,指定后面的 d、o、u、x 或 X 转换说明符适用于 long long 或 unsigned long long 参数。

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

Swift 5.2.4斯威夫特 5.2.4

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM