let n = 14var 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:
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) asString
ou
var st = String(NSString(format:"%2X", n))
ou
var st: String = NSString(format:"%2X", n)
Então você pode fazer:
let n = 123var st = NSString(format:"%2X", n) asString
st += " is the hexadecimal representation of \(n)"// "7B is the hexadecimal representation of 123"
Os números hex e decimais são invertidos em "7B é 123 em hex", então a expressão st deve ser corrigida para: st = "(n) é" + String (formato: "% 2X", n) + "em hex"
Kevin Sliech
@KevinSliech, admito que é ambíguo. Eu quis dizer como se alguém viesse e perguntasse "o que 7B representa?", E você respondesse "7B é o número 123 escrito em hexadecimal".
vacawama
Acho ambos um pouco ambíguos, especialmente agora que li os dois cerca de 1000 vezes. Outra forma seria escrever: "0x7B = 123d" ou algo parecido. A ambigüidade pode enganar pessoas que não são versadas em sistemas numéricos alternativos.
Kevin Sliech
@KevinSliech, obrigado. Eu fiz a declaração mais clara.
vacawama
1
Em Swift4, você deve usar "% 02X" em vez de "% 2X" se desejar "0" inicial se necessário ("% 2X" insira um espaço)
Bubu
54
Em Swift, existe um initmétodo específico Stringpara exatamente isso:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberserá do tipo UInt?Se precisar de mais, faça uma pergunta :)
Rich
talvez:String(0xf, radix: 0x10, uppercase: false)
Mazyod
@Rich Temos esse método raiz para NSString em Objective C?
Naresh Nallamsetty
39
Com o Swift 5, de acordo com suas necessidades, você pode escolher um dos três métodos a seguir para solucionar seu problema.
# 1. Usando Stringo init(_:radix:uppercase:)inicializador de
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:
# 2. Usando Stringo init(format:_:)inicializador de
Foundationfornece 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:_:):
# 3. Usando Stringo init(format:arguments:)inicializador de
Foundationfornece 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:):
% 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)
String s = "0x" + String(n, radix: 16)
Respostas:
Agora você pode fazer:
let n = 14 var st = String(format:"%02X", n) st += " is the hexadecimal representation of \(n)" print(st)
Nota: O
2
neste exemplo é a largura do campo e representa o comprimento mínimo desejado. O0
diz para preencher o resultado com iniciais0
, se necessário. (Sem o0
, 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 de2
; 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 deCocoa
ouUIKit
). Isso não é um problema se você estiver fazendo programação iOS ou macOS .Use letras maiúsculas
X
se quiserA...F
e minúsculasx
se quisera...f
:String(format: "%x %X", 64206, 64206) // "face FACE"
Se você deseja imprimir valores inteiros maiores que
UInt32.max
, adicionell
( el-el , não onze ) à string de formato:let n = UInt64.max print(String(format: "%llX is hexadecimal for \(n)", n))
Resposta Original
Você ainda pode usar
NSString
para fazer isso. O formato é:var st = NSString(format:"%2X", n)
Isso torna
st
umNSString
, então coisas como+=
não funcionam. Se você quiser ser capaz de anexar à string com+=
make dest
uma formaString
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"
fonte
Em Swift, existe um
init
método específicoString
para exatamente isso:let hex = String(0xF, radix: 16, uppercase: false) println("hex=\(hex)") // Output: f
fonte
"0xF"
para umUInt
?let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)
,number
será do tipoUInt?
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.
# 1. Usando
String
oinit(_:radix:uppercase:)
inicializador deO Swift
String
tem uminit(_:radix:uppercase:)
inicializador com a seguinte declaração:init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
O código Playground abaixo mostra como criar uma
String
instância que representa um valor inteiro em formato hexadecimal usandoinit(_:radix:uppercase:)
e sem a necessidade de importarFoundation
: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. Usando
String
oinit(format:_:)
inicializador deFoundation
forneceString
uminit(format:_:)
inicializador.init(format:_:)
tem a seguinte declaração:init(format: String, _ arguments: CVarArg...)
O Guia de programação de strings da Apple fornece uma lista dos especificadores de formato compatíveis com
String
eNSString
. Dentre esses especificadores de formato,%X
tem a seguinte descrição :O código Playground abaixo mostra como criar uma
String
instância que representa um valor inteiro em formato hexadecimal cominit(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. Usando
String
oinit(format:arguments:)
inicializador deFoundation
forneceString
uminit(format:arguments:)
inicializador.init(format:arguments:)
tem a seguinte declaração:init(format: String, arguments: [CVarArg])
O código Playground abaixo mostra como criar uma
String
instância que representa um valor inteiro em formato hexadecimal cominit(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"
fonte
Usar
let string2 = String(format:"%02X", 1) print(string2) // prints: "01"
No Swift3, a base de importação não é necessária, pelo menos não em um projeto. String deve ter todas as funcionalidades como NSString.
fonte
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)
fonte
Int("hexaString", radix: 16)
Swift 5.2.4
let value = 200 let hexString = String(format: "%02X", value)
fonte