Em Obj-C eu costumava converter um inteiro sem sinal n em uma string hexadecimal com
NSString *st = [NSString stringWithFormat:@"%2X", n];
Tentei por muito tempo traduzir isso para a linguagem Swift, mas sem sucesso.
Respostas:
Agora você pode fazer:
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
Nota: O 2neste exemplo é a largura do campo e representa o comprimento mínimo desejado. O 0diz para preencher o resultado com iniciais 0, se necessário. (Sem o 0, o resultado seria preenchido com espaços à esquerda). Obviamente, se o resultado for maior que dois caracteres, o comprimento do campo não será cortado para uma largura de 2; ele se expandirá para qualquer comprimento necessário para exibir o resultado completo.
Isso só funciona se você tiver Foundationimportado (isso inclui a importação de Cocoaou UIKit). Isso não é um problema se você estiver fazendo programação iOS ou macOS .
Use letras maiúsculas Xse quiser A...Fe minúsculas xse quiser a...f:
String(format: "%x %X", 64206, 64206) // "face FACE"
Se você deseja imprimir valores inteiros maiores que UInt32.max, adicione ll( el-el , não onze ) à string de formato:
let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615
Resposta Original
Você ainda pode usar NSStringpara fazer isso. O formato é:
var st = NSString(format:"%2X", n)
Isso torna stum NSString, então coisas como +=não funcionam. Se você quiser ser capaz de anexar à string com +=make de stuma forma Stringcomo esta:
var st = NSString(format:"%2X", n) as String
ou
var st = String(NSString(format:"%2X", n))
ou
var st: String = NSString(format:"%2X", n)
Então você pode fazer:
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"
Em Swift, existe um initmétodo específico Stringpara exatamente isso:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
"0xF"para um UInt?
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberserá do tipo UInt?Se precisar de mais, faça uma pergunta :)
String(0xf, radix: 0x10, uppercase: false)
Com o Swift 5, de acordo com suas necessidades, você pode escolher um dos três métodos a seguir para solucionar seu problema.
Stringo init(_:radix:uppercase:)inicializador deO Swift Stringtem um init(_:radix:uppercase:)inicializador com a seguinte declaração:
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
Cria uma string que representa o valor fornecido na base 10 ou alguma outra base especificada.
O código Playground abaixo mostra como criar uma Stringinstância que representa um valor inteiro em formato hexadecimal usando init(_:radix:uppercase:)e sem a necessidade de importar 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"
Stringo init(format:_:)inicializador deFoundationfornece Stringum init(format:_:)inicializador. init(format:_:)tem a seguinte declaração:
init(format: String, _ arguments: CVarArg...)
Retorna um
Stringobjeto inicializado usando uma determinada string de formato como um modelo no qual os valores de argumento restantes são substituídos.
O Guia de programação de strings da Apple fornece uma lista dos especificadores de formato compatíveis com Stringe NSString. Dentre esses especificadores de formato, %Xtem a seguinte descrição :
Inteiro de 32 bits sem sinal (
unsigned int), impresso em hexadecimal usando os dígitos 0–9 e A – F maiúsculas.
O código Playground abaixo mostra como criar uma Stringinstância que representa um valor inteiro em formato hexadecimal com 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"
Stringo init(format:arguments:)inicializador deFoundationfornece Stringum init(format:arguments:)inicializador. init(format:arguments:)tem a seguinte declaração:
init(format: String, arguments: [CVarArg])
Retorna um
Stringobjeto inicializado usando uma determinada string de formato como um modelo no qual os valores de argumento restantes são substituídos de acordo com a localidade padrão do usuário.
O código Playground abaixo mostra como criar uma Stringinstância que representa um valor inteiro em formato hexadecimal com 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"
As respostas acima funcionam bem para valores na faixa de um Int de 32 bits, mas os valores acima disso não funcionarão, pois o valor será acumulado.
Você precisa usar o modificador de comprimento para valores maiores que um Int de 32 bits
% x = inteiro de 32 bits sem sinal (int sem sinal)
ll = Modificadores de comprimento que especificam que um especificador de conversão d, o, u, x ou X seguinte se aplica a um argumento longo longo ou longo não assinado.
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)