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 2
neste exemplo é a largura do campo e representa o comprimento mínimo desejado. O 0
diz 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 Foundation
importado (isso inclui a importação de Cocoa
ou UIKit
). Isso não é um problema se você estiver fazendo programação iOS ou macOS .
Use letras maiúsculas X
se quiser A...F
e minúsculas x
se 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 NSString
para fazer isso. O formato é:
var st = NSString(format:"%2X", n)
Isso torna st
um NSString
, então coisas como +=
não funcionam. Se você quiser ser capaz de anexar à string com +=
make de st
uma forma String
como 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 init
método específico String
para 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)
, number
será 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.
String
o init(_:radix:uppercase:)
inicializador deO Swift String
tem 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 String
instâ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"
String
o init(format:_:)
inicializador deFoundation
fornece String
um init(format:_:)
inicializador. init(format:_:)
tem a seguinte declaração:
init(format: String, _ arguments: CVarArg...)
Retorna um
String
objeto 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 String
e NSString
. Dentre esses especificadores de formato, %X
tem 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 String
instâ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"
String
o init(format:arguments:)
inicializador deFoundation
fornece String
um init(format:arguments:)
inicializador. init(format:arguments:)
tem a seguinte declaração:
init(format: String, arguments: [CVarArg])
Retorna um
String
objeto 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 String
instâ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)