Jak przekonwertować ciąg int na szesnastkowy w języku Swift

85

W Obj-C użyłem do konwersji liczby całkowitej bez znaku n na ciąg szesnastkowy z

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

Długo próbowałem przetłumaczyć to na język Swift, ale bezskutecznie.

boscarol
źródło
Na podstawie odpowiedzi udzielonej przez stackoverflow.com/users/1187415/martin-r tutaj stackoverflow.com/questions/24986319/… , możesz to zrobićString s = "0x" + String(n, radix: 16)
Zhao

Odpowiedzi:

138

Możesz teraz:

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

Uwaga: W 2tym przykładzie jest to szerokość pola i reprezentuje wymaganą minimalną długość. 0Informuje go pad wynik z wiodącym 0„s, jeśli to konieczne. (Bez znaku 0wynik byłby wypełniony spacjami wiodącymi). Oczywiście, jeśli wynik jest większy niż dwa znaki, długość pola nie zostanie obcięta do szerokości2 ; rozszerzy się do dowolnej długości niezbędnej do wyświetlenia pełnego wyniku.

Działa to tylko wtedy, gdy Foundationdokonałeś importu (obejmuje to import Cocoalub UIKit). Nie stanowi to problemu, jeśli programujesz w systemie iOS lub macOS .

Użyj wielkich liter, Xjeśli chcesz, A...Fi małych, xjeśli chcesz a...f:

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

Jeśli chcesz wydrukować wartości całkowite większe niż UInt32.max, dodaj ll( el-el , nie jedenaście ) do ciągu formatu:

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

Oryginalna odpowiedź

Nadal możesz NSStringto zrobić. Format to:

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

To sprawia , tak jak wtedy rzeczy nie działają. Jeśli chcesz móc dołączyć do ciągu za pomocą make w następujący sposób :stNSString+=+=stString

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

lub

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

lub

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

Następnie możesz:

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"
vacawama
źródło
Liczby szesnastkowe i dziesiętne są zamienione w „7B to 123 w formacie szesnastkowym”, więc pierwsze wyrażenie należy poprawić do: st = „(n) to„ + String (format: „% 2X”, n) + „in hex”
Kevin Sliech
@KevinSliech, przyznaję, że jest to niejednoznaczne. Miałem na myśli to tak, jakby ktoś podszedł i zapytał „co reprezentuje 7B?”, A ty odpowiedziałbyś „7B to liczba 123 zapisana w systemie szesnastkowym”.
vacawama
Uważam, że oba są trochę niejednoznaczne, zwłaszcza teraz, gdy przeczytałem je ~ 1000 razy. Innym sposobem byłoby napisanie: „0x7B = 123d” lub coś w tym rodzaju. Ta dwuznaczność może naruszyć ludzi, którzy nie są dobrze zorientowani w alternatywnych systemach liczbowych.
Kevin Sliech
@KevinSliech, dzięki. Wyjaśniłem to oświadczenie.
vacawama,
1
W Swift4 musisz użyć „% 02X” zamiast „% 2X”, jeśli chcesz w razie potrzeby rozpocząć „0” („% 2X” wstaw spację)
Bubu
54

W Swift jest do tego konkretna initmetoda String:

let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
Bogaty
źródło
1
Jak mogę przekonwertować ten ciąg na UInt?
TomSawyer,
3
chcesz przekonwertować "0xF"na UInt?
Rich
1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberbędzie typowe UInt?Jeśli potrzebujesz więcej zadaj pytanie :)
Rich
String(0xf, radix: 0x10, uppercase: false)
mayhap
@Rich Czy mamy tę metodę podstawową dla NSString w celu C?
Naresh Nallamsetty
39

Dzięki Swift 5, w zależności od potrzeb, możesz wybrać jedną z trzech poniższych metod w celu rozwiązania problemu.


# 1. Korzystanie Stringz init(_:radix:uppercase:)inicjatora

Swift Stringma init(_:radix:uppercase:)inicjator z następującą deklaracją:

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

Tworzy ciąg reprezentujący daną wartość o podstawie 10 lub innej określonej podstawie.

Poniższy kod Playground pokazuje, jak utworzyć Stringinstancję, która reprezentuje wartość całkowitą w formacie szesnastkowym przy użyciu init(_:radix:uppercase:)i bez konieczności importowania 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. Korzystanie Stringz init(format:​_:​)inicjatora

Foundationprzewiduje Stringsię init(format:​_:​)inicjator. init(format:​_:​)posiada następującą deklarację:

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

Zwraca Stringobiekt zainicjowany przy użyciu danego ciągu formatu jako szablonu, w którym są podstawiane pozostałe wartości argumentów.

Podręcznik programowania ciągów znaków firmy Apple zawiera listę specyfikatorów formatu, które są obsługiwane przez Stringi NSString. Wśród tych specyfikatorów formatu %Xznajduje się następujący opis :

32-bitowa liczba całkowita bez znaku ( unsigned int), drukowana szesnastkowo z użyciem cyfr 0–9 i wielkich liter A – F.

Poniższy kod Playground pokazuje, jak utworzyć Stringinstancję, która reprezentuje wartość całkowitą w formacie szesnastkowym za pomocą 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. Korzystanie Stringz init(format:​arguments:​)inicjatora

Foundationprzewiduje Stringsię init(format:​arguments:​)inicjator. init(format:​arguments:​)posiada następującą deklarację:

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

Zwraca a String obiekt zainicjowany przy użyciu danego ciągu formatu jako szablonu, w którym pozostałe wartości argumentów są podstawiane zgodnie z domyślnymi ustawieniami narodowymi użytkownika.

Poniższy kod Playground pokazuje, jak utworzyć Stringinstancję, która reprezentuje wartość całkowitą w formacie szesnastkowym za pomocą 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"
Imanou Petit
źródło
2

Używać

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

W Swift3 podstawa importu nie jest wymagana, przynajmniej nie w projekcie. Ciąg powinien mieć taką samą funkcjonalność jak NSString.

Dobry czas
źródło
1

Powyższe odpowiedzi działają dobrze dla wartości z zakresu 32-bitowego Int, ale wartości powyżej tego nie będą działać, ponieważ wartość zostanie przeniesiona.

Musisz użyć modyfikatora długości dla wartości większych niż 32-bitowe Int

% x = 32-bitowa liczba całkowita bez znaku (liczba całkowita bez znaku)

ll = modyfikatory długości określające, że następujący po nim specyfikator konwersji d, o, u, x lub X ma zastosowanie do długiego argumentu o długości lub długości bez znaku.

let hexString = String(format:"%llX", decimalValue)
MikeJ
źródło
Dodaj kod, aby również przekonwertować szesnastkowy na dziesiętny.
Varun Naharia,
@VarunNahariaInt("hexaString", radix: 16)
Leo Dabus
0

Swift 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
hectorsvill
źródło