Een Int naar Hex String converteren in Swift

In Obj-C converteerde ik een niet-ondertekend geheel getal n naar een hexadecimale tekenreeks met

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

Ik heb lang geprobeerd dit in Swift-taal te vertalen, maar zonder succes.


Antwoord 1, autoriteit 100%

U kunt nu het volgende doen:

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

Opmerking: De 2in dit voorbeeld is de veldbreedteen vertegenwoordigt de gewenste minimalelengte. De 0vertelt het om het resultaat zo nodig op te vullen met leidende 0‘s. (Zonder de 0zou het resultaat worden opgevuld met voorloopspaties). Als het resultaat groter is dan twee tekens, wordt de veldlengte natuurlijk niet afgekapt tot een breedte van 2; het zal uitbreiden tot de lengte die nodig is om het volledige resultaat weer te geven.

Dit werkt alleen als je Foundationhebt geïmporteerd (dit omvat het importeren van Cocoaof UIKit). Dit is geen probleem als je aan het programmeren bent voor iOSof macOS.

Gebruik hoofdletters xals u a...fen kleine letters xwilt als u a...f:

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

Als u gehele getallen groter dan UInt32.maxwilt afdrukken, voegt u lltoe (el-el, niet eleven) naar de format string:

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

Oorspronkelijk antwoord

Je kunt nog steeds NSStringgebruiken om dit te doen. Het formaat is:

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

Dit maakt van steen NSString, dus dan werken dingen als +=niet. Als je de string met +=wilt kunnen toevoegen, maak dan van steen Stringzoals deze:

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

of

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

of

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

Dan kun je het volgende doen:

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"

Antwoord 2, autoriteit 34%

In Swift is er een specifieke initmethode op Stringvoor precies dit:

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

Antwoord 3, autoriteit 29%

Met Swift 5 kunt u, afhankelijk van uw behoeften, een van de drie volgende methoden kiezen om uw probleem op te lossen.


#1. Met behulp van String‘s init(_:radix:uppercase:)initializer

Swift Stringheeft een init(_:radix:uppercase:)initialisatie met de volgende verklaring:

init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger

Creëert een string die de gegeven waarde in grondtal 10 of een andere gespecificeerde grondtal voorstelt.

De onderstaande Playground-code laat zien hoe u een String-instantie maakt die een geheel getal in hexadecimaal formaat vertegenwoordigt door init(_:radix:uppercase:)te gebruiken en zonder om Foundationte importeren:

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. Met behulp van String‘s init(format:​_:​)initialisator

Foundationbiedt Stringeen init(format:​_:​)initialisatie. init(format:​_:​)heeft de volgende declaratie:

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

Retourneert een String-object dat is geïnitialiseerd door een gegeven opmaaktekenreeks te gebruiken als een sjabloon waarin de resterende argumentwaarden worden vervangen.

De String Programming Guidevan Apple geeft een lijst van de formaatspecificaties die worden ondersteund door Stringen NSString. Van die indelingsspecificaties heeft %Xde volgende beschrijving:

Niet-ondertekend 32-bits geheel getal (unsigned int), hexadecimaal gedrukt met de cijfers 0–9 en hoofdletters A–F.

De onderstaande Playground-code laat zien hoe u een instantie Stringmaakt die een geheel getal in hexadecimaal formaat vertegenwoordigt met 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. Met behulp van String‘s init(format:​arguments:​)initialisator

Foundationbiedt Stringeen init(format:​arguments:​)initialisatie. init(format:​arguments:​)heeft de volgende verklaring:

init(format: String, arguments: [CVarArg])

Retourneert een String-object dat is geïnitialiseerd met behulp van een bepaalde opmaaktekenreeks als sjabloon waarin de resterende argumentwaarden worden vervangen volgens de standaardinstelling van de gebruiker.

De onderstaande Playground-code laat zien hoe u een instantie Stringmaakt die een geheel getal in hexadecimaal formaat vertegenwoordigt met 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"

Antwoord 4, autoriteit 3%

Swift 5.2.4

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

Antwoord 5, autoriteit 2%

De bovenstaande antwoorden werken prima voor waarden in het bereik van een 32-bits Int, maar waarden daarboven werken niet omdat de waarde overloopt.

U moet de lengte-modifier gebruiken voor waarden groter dan een 32-bits Int

%x = Unsigned 32-bit integer (unsigned int)

ll = Lengtemodifiers die specificeren dat een volgende d, o, u, x of X conversiespecificatie van toepassing is op een long long of unsigned long long argument.

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

Antwoord 6

Te gebruiken

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

In Swift3 is importfundatie niet vereist, althans niet in een project.
String moet alle functionaliteit hebben als NSString.

Other episodes