Cómo convertir una cadena Int a Hex en Swift

Respuestas:

138

Ahora puedes hacer:

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: 2en este ejemplo es el ancho del campo y representa la longitud mínima deseada. El 0le dice que rellene el resultado con interlineados 0si es necesario. (Sin el 0, el resultado se rellenaría con espacios iniciales). Por supuesto, si el resultado tiene más de dos caracteres, la longitud del campo no se recortará a un ancho de 2; se expandirá a la longitud necesaria para mostrar el resultado completo.

Esto solo funciona si ha Foundationimportado (esto incluye la importación de Cocoao UIKit). Esto no es un problema si está programando iOS o macOS .

Use mayúsculas Xsi lo desea A...Fy minúsculas xsi lo desea a...f:

String(format: "%x %X", 64206, 64206)  // "face FACE"

Si desea imprimir valores enteros mayores que UInt32.max, agregue ll( el-el , no once ) a la cadena de formato:

let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615

Respuesta original

Todavía puedes usar NSString para hacer esto. El formato es:

var st = NSString(format:"%2X", n)

Esto hace stun NSString, entonces cosas como +=no funcionan. Si desea poder agregar a la cadena con +=makest en una Stringcomo esta:

var st = NSString(format:"%2X", n) as String

o

var st = String(NSString(format:"%2X", n))

o

var st: String = NSString(format:"%2X", n)

Entonces puedes hacer:

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
fuente
Los números hexadecimales y decimales están invertidos en "7B es 123 en hexadecimal", por lo que la expresión st debe corregirse a: st = "(n) es" + Cadena (formato: "% 2X", n) + "en hexadecimal"
Kevin Sliech
@KevinSliech, admito que es ambiguo. Lo dije en serio como si alguien se acercara y preguntara, "¿qué representa 7B?", Y tu responderías "7B es el número 123 escrito en hexadecimal".
vacawama
Encuentro ambos un poco ambiguos, especialmente ahora que los he leído ~ 1000 veces. Otra forma sería escribir: "0x7B = 123d" o algo así. La ambigüedad podría confundir a las personas que no estén bien versadas en sistemas de números alternativos.
Kevin Sliech
@KevinSliech, gracias. Hice la declaración más clara.
vacawama
1
En Swift4 debe utilizar "% 02X" en lugar de "% 2X" si desea "0" inicial si es necesario ("% 2X" inserte un espacio)
Bubu
54

En Swift hay un initmétodo específico Stringpara exactamente esto:

let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
Rico
fuente
1
¿Cómo puedo convertir esta cadena a UInt?
TomSawyer
3
quieres convertir "0xF"a UInt?
Rich
1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberserá de tipo UInt?Si necesita más, haga una pregunta :)
Rich
mayhap:String(0xf, radix: 0x10, uppercase: false)
Mazyod
@Rich ¿Tenemos este método de base para NSString en Objective C?
Naresh Nallamsetty
39

Con Swift 5, según sus necesidades, puede elegir uno de los tres métodos siguientes para resolver su problema.


# 1. Usando Stringel init(_:radix:uppercase:)inicializador de

Swift Stringtiene un init(_:radix:uppercase:)inicializador con la siguiente declaración:

init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger

Crea una cadena que representa el valor dado en base 10, o alguna otra base especificada.

El siguiente código de Playground muestra cómo crear una Stringinstancia que representa un valor entero en formato hexadecimal usando init(_:radix:uppercase:)y sin tener que 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 Stringel init(format:​_:​)inicializador de

Foundationproporciona Stringuninit(format:​_:​) inicializador. init(format:​_:​)tiene la siguiente declaración:

init(format: String, _ arguments: CVarArg...)

Devuelve un Stringobjeto inicializado mediante el uso de una cadena de formato determinada como plantilla en la que se sustituyen los valores restantes de los argumentos.

La Guía de programación de cadenas de Apple proporciona una lista de los especificadores de formato que son compatibles con Stringy NSString. Entre esos especificadores de formato,%X tiene la siguiente descripción :

Entero de 32 bits sin signo ( unsigned int), impreso en hexadecimal con los dígitos 0–9 y A – F en mayúsculas.

El siguiente código de Playground muestra cómo crear una Stringinstancia que represente un valor entero en formato hexadecimal con 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 Stringel init(format:​arguments:​)inicializador de

Foundationproporciona Stringuninit(format:​arguments:​) inicializador. init(format:​arguments:​)tiene la siguiente declaración:

init(format: String, arguments: [CVarArg])

Devuelve un Stringobjeto inicializado mediante el uso de una cadena de formato determinada como plantilla en la que los valores restantes de los argumentos se sustituyen de acuerdo con la configuración regional predeterminada del usuario.

El siguiente código de Playground muestra cómo crear una Stringinstancia que represente un valor entero en formato hexadecimal con 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
fuente
2

Usar

let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"

En Swift3 no se requiere una base de importación, al menos no en un proyecto. La cadena debe tener todas las funciones de NSString.

Buen tiempo
fuente
1

Las respuestas anteriores funcionan bien para valores en el rango de un Int de 32 bits, pero los valores por encima de esto no funcionarán ya que el valor se traspasará.

Debe utilizar el modificador de longitud para valores superiores a un Int de 32 bits

% x = entero de 32 bits sin signo (int sin signo)

ll = Modificadores de longitud que especifican que el siguiente especificador de conversión d, o, u, x o X se aplica a un argumento long long o unsigned long long.

let hexString = String(format:"%llX", decimalValue)
MikeJ
fuente
Agregue código para convertir hexadecimal de nuevo a decimal también.
Varun Naharia
@VarunNahariaInt("hexaString", radix: 16)
Leo Dabus
0

Rápido 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
hectorsvill
fuente