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


Answers:


138

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

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添加llel-el,而不是11):

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,因此类似之类的东西+=将不起作用。如果你希望能够追加到带有字符串+=化妆stString这样的:

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)是” + String(format:“%2X”,n)+“在十六进制中”
凯文·史利希

@KevinSliech,我承认它是模棱两可的。我的意思是好像有人上前问“ 7B代表什么?”,而您会回答“ 7B是用十六进制写的数字123”。
vacawama '16

我发现这两者有点模棱两可,尤其是现在我已经阅读了约1000次。另一种方法是编写:“ 0x7B = 123d”或类似的内容。模棱两可可能会使那些不熟悉备用数字系统的人发疯。
凯文·斯利希

@KevinSliech,谢谢。我说得更清楚。
vacawama '16

1
在Swift4中,如果要在必要时加“ 0”,则必须使用“%02X”而不是“%2X”(“%2X”插入空格)
Bubu

54

在Swift中,有一种特定的init方法可以实现String以下目的:

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

1
如何将此字符串转换为UInt?
TomSawyer

3
您想转换"0xF"成一个UInt
Rich

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)number将为类型UInt?如果您需要更多问题,请问一个问题:)
Rich

mayhap:String(0xf, radix: 0x10, uppercase: false)
Mazyod '16

@Rich我们在Objective C中对NSString使用这个基数方法吗?
Naresh Nallamsetty

39

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


#1 使用 Stringinit(_:radix:uppercase:)初始值设定项

SwiftString有一个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。使用Stringinit(format:​_:​)初始值设定项

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

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

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

Apple的String编程指南列出了Stringand支持的格式说明符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。使用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"

2

使用

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

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


1

上面的答案对于32位Int范围内的值都可以正常工作,但是超过此值的值将不起作用,因为该值会翻转。

您需要将length修饰符用于大于32bit Int的值

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

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

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

请添加代码以将十六进制也转换回十进制。
Varun Naharia

@VarunNahariaInt("hexaString", radix: 16)
Leo Dabus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.