let n = 14var 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:
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) asString
lub
var st = String(NSString(format:"%2X", n))
lub
var st: String = NSString(format:"%2X", n)
Następnie możesz:
let n = 123var st = NSString(format:"%2X", n) asString
st += " is the hexadecimal representation of \(n)"// "7B is the hexadecimal representation of 123"
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
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.
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:
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:_:):
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:):
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.
% 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)
String s = "0x" + String(n, radix: 16)
Odpowiedzi:
Możesz teraz:
let n = 14 var st = String(format:"%02X", n) st += " is the hexadecimal representation of \(n)" print(st)
Uwaga: W
2
tym przykładzie jest to szerokość pola i reprezentuje wymaganą minimalną długość.0
Informuje go pad wynik z wiodącym0
„s, jeśli to konieczne. (Bez znaku0
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 importCocoa
lubUIKit
). 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 chcesza...f
:String(format: "%x %X", 64206, 64206) // "face FACE"
Jeśli chcesz wydrukować wartości całkowite większe niż
UInt32.max
, dodajll
( el-el , nie jedenaście ) do ciągu formatu:let n = UInt64.max print(String(format: "%llX is hexadecimal for \(n)", n))
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"
źródło
W Swift jest do tego konkretna
init
metodaString
:let hex = String(0xF, radix: 16, uppercase: false) println("hex=\(hex)") // Output: f
źródło
"0xF"
naUInt
?let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)
,number
będzie typoweUInt?
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.
# 1. Korzystanie
String
zinit(_:radix:uppercase:)
inicjatoraSwift
String
mainit(_:radix:uppercase:)
inicjator z następującą deklaracją:init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
Poniższy kod Playground pokazuje, jak utworzyć
String
instancję, która reprezentuje wartość całkowitą w formacie szesnastkowym przy użyciuinit(_:radix:uppercase:)
i bez konieczności importowaniaFoundation
: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
String
zinit(format:_:)
inicjatoraFoundation
przewidujeString
sięinit(format:_:)
inicjator.init(format:_:)
posiada następującą deklarację:init(format: String, _ arguments: CVarArg...)
Podręcznik programowania ciągów znaków firmy Apple zawiera listę specyfikatorów formatu, które są obsługiwane przez
String
iNSString
. Wśród tych specyfikatorów formatu%X
znajduje się następujący opis :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"
# 3. Korzystanie
String
zinit(format:arguments:)
inicjatoraFoundation
przewidujeString
sięinit(format:arguments:)
inicjator.init(format:arguments:)
posiada następującą deklarację:init(format: String, arguments: [CVarArg])
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"
źródło
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.
źródło
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)
źródło
Int("hexaString", radix: 16)
Swift 5.2.4
let value = 200 let hexString = String(format: "%02X", value)
źródło