web-dev-qa-db-fra.com

Comment convertir un Int en Hex String dans Swift

Dans Obj-C, je convertissais un entier non signé n en chaîne hexagonale avec

 NSString *st = [NSString stringWithFormat:@"%2X", n];

J'ai essayé pendant longtemps de traduire cela en Swift langue, mais sans succès.

65
boscarol

Vous pouvez maintenant faire:

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

Noter la 2 dans cet exemple est la largeur du champ et représente la longueur minimale voulu. Le 0 lui dit de compléter le résultat avec 0 est si nécessaire. (Sans le 0, le résultat serait complété par des espaces de début). Bien entendu, si le résultat est supérieur à deux caractères, la longueur du champ ne sera pas tronquée à une largeur de 2; il sera étendu à la longueur nécessaire pour afficher le résultat complet.

Cela ne fonctionne que si vous avez importé Foundation (ceci inclut l'importation de Cocoa ou UIKit). Ce n'est pas un problème si vous utilisez iOS ou macOS programmation.

Utilisez des majuscules X si vous voulez A...F et _ minuscule x si vous voulez a...f:

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

Si vous souhaitez imprimer des valeurs entières supérieures à UInt32.max, ajoutez ll ( el-el , pas onze ) à la chaîne de format:

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

Réponse originale

Vous pouvez toujours utiliser NSString pour le faire. Le format est:

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

Cela fait de st un NSString, alors des choses comme += ne fonctionnent pas. Si vous voulez pouvoir ajouter à la chaîne avec += transformez st en un String comme ceci:

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

ou

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

ou

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

Ensuite, vous pouvez faire:

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"
102
vacawama

Dans Swift, il existe une méthode spécifique init sur String pour exactement ceci:

let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
49
Rich

Avec Swift 5, selon vos besoins, vous pouvez choisir l’une des trois méthodes suivantes pour résoudre votre problème.


#1. Utilisation de String's init(_:radix:uppercase:) initializer

Swift String a un initialiseur init(_:radix:uppercase:) avec la déclaration suivante:

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

Crée une chaîne représentant la valeur donnée en base 10 ou une autre base spécifiée.

Le code de Playground ci-dessous montre comment créer une instance String représentant un entier au format hexadécimal en utilisant init(_:radix:uppercase:) et sans avoir à importer 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. Utilisation de String's init(format:​_:​) initializer

Foundation fournit String un init(format:​_:​) initialiseur. init(format:​_:​) a la déclaration suivante:

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

Renvoie un objet String initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées.

Le Guide de programmation de chaînes de Apple fournit une liste des spécificateurs de format pris en charge par String et NSString. Parmi ces spécificateurs de format, %X A le suivant description :

Entier 32 bits non signé (unsigned int), Imprimé au format hexadécimal à l'aide des chiffres 0 à 9 et des majuscules A à F.

Le code de Playground ci-dessous montre comment créer une instance String qui représente une valeur entière au format hexadécimal avec 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. Utilisation de String's init(format:​arguments:​) initializer

Foundation fournit String un init(format:​arguments:​) initialiseur. init(format:​arguments:​) a la déclaration suivante:

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

Renvoie un objet String initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées en fonction des paramètres régionaux par défaut de l'utilisateur.

Le code de Playground ci-dessous montre comment créer une instance String qui représente une valeur entière au format hexadécimal avec 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"
25
Imanou Petit

Utiliser

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

Dans Swift3, la base d'importation n'est pas requise, du moins pas dans un projet. String devrait avoir toutes les fonctionnalités de NSString.

2
Goodtime

Les réponses ci-dessus fonctionnent correctement pour les valeurs comprises dans la plage d'un Int de 32 bits, mais les valeurs dépassant cette valeur ne fonctionneront pas à mesure que la valeur sera reportée.

Vous devez utiliser le modificateur de longueur pour les valeurs supérieures à 32bit Int

% x = entier non signé de 32 bits (unsigned int)

ll = Modificateurs de longueur spécifiant qu'un spécificateur de conversion suivant d, o, u, x ou X s'applique à un argument long long ou unsigned long long.

let hexString = String(format:"%llX", decimalValue)
1
MikeJ