So konvertieren Sie einen Int in einen Hex-String in Swift


82

In Obj-C habe ich eine vorzeichenlose Ganzzahl n in eine Hex-Zeichenfolge mit konvertiert

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

Ich habe lange versucht, dies in die Swift-Sprache zu übersetzen, aber erfolglos.


Basierend auf der Antwort von stackoverflow.com/users/1187415/martin-r hier stackoverflow.com/questions/24986319/… können Sie tunString s = "0x" + String(n, radix: 16)
Zhao

Antworten:


133

Sie können jetzt tun:

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

Hinweis: In 2diesem Beispiel ist die Feldbreite angegeben und stellt die gewünschte Mindestlänge dar . Das 0weist es an, das Ergebnis bei 0Bedarf mit führenden zu füllen . (Ohne das 0würde das Ergebnis mit führenden Leerzeichen aufgefüllt). Wenn das Ergebnis größer als zwei Zeichen ist, wird die Feldlänge natürlich nicht auf eine Breite von 2; Es wird auf die Länge erweitert, die zur Anzeige des vollständigen Ergebnisses erforderlich ist.

Dies funktioniert nur, wenn Sie Foundationimportiert haben (dies schließt den Import von Cocoaoder ein UIKit). Dies ist kein Problem, wenn Sie iOS- oder MacOS- Programme ausführen .

Verwenden Sie Großbuchstaben, Xwenn Sie möchten, A...Fund Kleinbuchstaben, xwenn Sie möchten a...f:

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

Wenn Sie ganzzahlige Werte größer als drucken möchten UInt32.max, fügen Sie der Formatzeichenfolge ll( el-el , nicht elf ) hinzu:

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

Ursprüngliche Antwort

Sie können dies weiterhin verwenden NSString. Das Format ist:

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

Das macht stein NSString, also dann +=funktionieren Dinge wie nicht. Wenn Sie in der Lage sein möchten, die Zeichenfolge mit +=make stin a Stringlike wie folgt anzuhängen :

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

oder

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

oder

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

Dann können Sie tun:

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"

Die Hex- und Dezimalzahlen werden in "7B ist 123 in hex" umgekehrt, daher sollte der st-Ausdruck korrigiert werden zu: st = "(n) ist" + String (Format: "% 2X", n) + "in hex"
Kevin Sliech

@ KevinSliech, ich gebe zu, dass es mehrdeutig ist. Ich meinte es so, als ob jemand auftauchte und fragte: "Was bedeutet 7B?", Und Sie antworteten: "7B ist die hexadezimal geschriebene Zahl 123".
Vacawama

Ich finde beide etwas mehrdeutig, besonders jetzt, wo ich beide ~ 1000 Mal gelesen habe. Ein anderer Weg wäre zu schreiben: "0x7B = 123d" oder so ähnlich. Die Mehrdeutigkeit könnte Leute vermasseln, die sich mit alternativen Zahlensystemen nicht auskennen.
Kevin Sliech

@ KevinSliech, danke. Ich habe die Aussage klarer gemacht.
Vacawama

1
In Swift4 müssen Sie "% 02X" anstelle von "% 2X" verwenden, wenn Sie bei Bedarf "0" führen möchten ("% 2X" ein Leerzeichen einfügen)
Bubu

53

In Swift gibt es genau dafür eine spezielle initMethode String:

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

1
Wie kann ich diesen String in UInt konvertieren?
TomSawyer

3
Sie konvertieren möchten , "0xF"um ein UInt?
Rich

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberwird vom Typ sein UInt?Wenn Sie mehr brauchen, stellen Sie eine Frage :)
Rich

Vielleicht:String(0xf, radix: 0x10, uppercase: false)
Mazyod

@Rich Haben wir diese Radix-Methode für NSString in Ziel C?
Naresh Nallamsetty

37

Mit Swift 5 können Sie je nach Bedarf eine der drei folgenden Methoden auswählen, um Ihr Problem zu lösen.


# 1. Verwenden Stringdes init(_:radix:uppercase:)Initialisierers

Swift Stringhat einen init(_:radix:uppercase:)Initialisierer mit der folgenden Deklaration:

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

Erstellt eine Zeichenfolge, die den angegebenen Wert in Basis 10 oder einer anderen angegebenen Basis darstellt.

Der folgende Spielplatzcode zeigt, wie Sie eine StringInstanz erstellen , die einen ganzzahligen Wert im Hexadezimalformat darstellt, indem Sie init(_:radix:uppercase:)und ohne Import verwenden 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. Verwenden Stringdes init(format:​_:​)Initialisierers

Foundationbietet Stringeinen init(format:​_:​)Initialisierer. init(format:​_:​)hat die folgende Erklärung:

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

Gibt ein StringObjekt zurück, das mithilfe einer bestimmten Formatzeichenfolge als Vorlage initialisiert wurde, in die die verbleibenden Argumentwerte eingesetzt werden.

Das Apple String Programming Guide enthält eine Liste der Formatbezeichner, die von Stringund unterstützt werden NSString. Unter diesen Formatspezifizierern %Xhat die folgende Beschreibung :

Vorzeichenlose 32-Bit-Ganzzahl ( unsigned int), hexadezimal gedruckt mit den Ziffern 0–9 und Großbuchstaben A - F.

Der folgende Spielplatzcode zeigt, wie Sie eine StringInstanz erstellen , die einen ganzzahligen Wert im Hexadezimalformat darstellt, mit 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. Verwenden Stringdes init(format:​arguments:​)Initialisierers

Foundationbietet Stringeinen init(format:​arguments:​)Initialisierer. init(format:​arguments:​)hat die folgende Erklärung:

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

Gibt ein StringObjekt zurück, das mithilfe einer bestimmten Formatzeichenfolge als Vorlage initialisiert wurde, in die die verbleibenden Argumentwerte gemäß dem Standardgebietsschema des Benutzers eingesetzt werden.

Der folgende Spielplatzcode zeigt, wie Sie eine StringInstanz erstellen , die einen ganzzahligen Wert im Hexadezimalformat darstellt, mit 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

Benutzen

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

In Swift3 ist keine Importgrundlage erforderlich, zumindest nicht in einem Projekt. String sollte alle Funktionen als NSString haben.


1

Die obigen Antworten funktionieren gut für Werte im Bereich eines 32-Bit-Int, aber Werte darüber funktionieren nicht, da der Wert verlängert wird.

Sie müssen den Längenmodifikator für Werte verwenden, die größer als ein 32-Bit-Int sind

% x = 32-Bit-Ganzzahl ohne Vorzeichen (int ohne Vorzeichen)

ll = Längenmodifikatoren, die angeben, dass ein nachfolgender Konvertierungsspezifizierer für d, o, u, x oder X für ein langes langes oder vorzeichenloses langes langes Argument gilt.

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

Bitte fügen Sie Code hinzu, um Hex auch wieder in Dezimalzahlen umzuwandeln.
Varun Naharia

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

0

Swift 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.