Como converter um Int em Hex String em Swift

Respostas:

139

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"
Vacawama
fonte
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
Rico
fonte
1
Como posso converter essa String em UInt?
TomSawyer
3
você deseja converter "0xF"para um UInt?
Rich
1
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

O 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"

# 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:​_:​):

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 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:​):

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"
Imanou Petit
fonte
2

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.

Bom tempo
fonte
1

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)
MikeJ
fonte
Adicione o código para converter hexadecimal de volta em decimal também.
Varun Naharia
@VarunNahariaInt("hexaString", radix: 16)
Leo Dabus
0

Swift 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
Hectorsvill
fonte