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.
Odpowiedzi:
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 2
tym przykładzie jest to szerokość pola i reprezentuje wymaganą minimalną długość. 0
Informuje go pad wynik z wiodącym 0
„s, jeśli to konieczne. (Bez znaku 0
wynik 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 Foundation
dokonałeś importu (obejmuje to import Cocoa
lub UIKit
). Nie stanowi to problemu, jeśli programujesz w systemie iOS lub macOS .
Użyj wielkich liter, X
jeśli chcesz, A...F
i małych, x
jeś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 NSString
to 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 :st
NSString
+=
+=
st
String
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"
W Swift jest do tego konkretna init
metoda String
:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
"0xF"
na UInt
?
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)
, number
będzie typowe UInt?
Jeśli potrzebujesz więcej zadaj pytanie :)
String(0xf, radix: 0x10, uppercase: false)
Dzięki Swift 5, w zależności od potrzeb, możesz wybrać jedną z trzech poniższych metod w celu rozwiązania problemu.
String
z init(_:radix:uppercase:)
inicjatoraSwift String
ma 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ć String
instancję, 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"
String
z init(format:_:)
inicjatoraFoundation
przewiduje String
się init(format:_:)
inicjator. init(format:_:)
posiada następującą deklarację:
init(format: String, _ arguments: CVarArg...)
Zwraca
String
obiekt 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 String
i NSString
. Wśród tych specyfikatorów formatu %X
znajduje 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ć String
instancję, 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"
String
z init(format:arguments:)
inicjatoraFoundation
przewiduje String
się 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ć String
instancję, 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"
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.
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)
Int("hexaString", radix: 16)
Swift 5.2.4
let value = 200
let hexString = String(format: "%02X", value)
String s = "0x" + String(n, radix: 16)