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 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"
W Swift jest do tego konkretna initmetoda 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), numberbę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.
Stringz init(_:radix:uppercase:)inicjatoraSwift 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"
Stringz init(format:_:)inicjatoraFoundationprzewiduje 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"
Stringz init(format:arguments:)inicjatoraFoundationprzewiduje Stringsię init(format:arguments:)inicjator. init(format:arguments:)posiada następującą deklarację:
init(format: String, arguments: [CVarArg])
Zwraca a
Stringobiekt 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"
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)