Comment convertir des Données de chaîne hexadécimale en swift
Je veux la représentation hexadécimale d'une valeur de Données de Swift.
Finalement, je voudrais utiliser comme ceci:
let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")!
print(data.hexString)
Vous devez vous connecter pour publier un commentaire.
Une alternative de mise en œuvre (prise de Comment crypte de la chaîne d'sha1 avec Swift?, avec une option supplémentaire pour la majuscule de sortie) serait
J'ai choisi un
hexEncodedString(options:)
méthode dans le style de la méthode existantebase64EncodedString(options:)
.Data
est conforme à laCollection
protocole, donc on peut utilisermap()
à la carte chaque octet correspondant de la chaîne hexadécimale.Le
%02x
format de l'argument en base 16, rempli jusqu'à deux chiffresavec un zéro si nécessaire. Le
hh
causes modificateur argument(qui est passé comme un entier sur la pile) d'être traité comme un octet
quantité. On pourrait omettre le modificateur ici parce que
$0
est un unsignednombre (
UInt8
) et pas de signe-extension va se produire, mais il ne fait pas de mal de quitteril en.
Le résultat est ensuite jointe à une seule chaîne.
Exemple:
La suite de la mise en œuvre est plus rapide d'un facteur d'environ 120
(testé avec 1000 octets aléatoires). Il est similaire à
RenniePet de la solution
et Nick Moore solution, mais sur la base de code UTF-16 unités, ce qui est le Swift
cordes (actuellement) de l'utiliser comme espace de stockage interne.
extension
sur une Pomme de classe quand unfunc
peuvent être utilisés j'aime la symétrie avecbase64EncodedString
.Data
contient arbitraire d'octets et n'a pas d'encodage.Le présent code s'applique à la
Data
type avec une propriété calculée. Il parcourt les octets de données et concatène les octets de la représentation hexadécimale du résultat:return (self as NSData).description
return map { String(format: "%02hhx", $0) }.joined()
Ma version. Ce n'est pas aussi élégante, mais elle est environ 10 fois plus rapide que l'on a accepté la réponse de Martin R.
Ce n'est pas vraiment répondre à l'OP de la question, car il fonctionne sur un rapide tableau d'octets, et non pas un objet de Données. Et il est beaucoup plus grand que les autres réponses. Mais elle devrait être plus efficace, car elle évite l'aide de la Chaîne(format: ).
De toute façon, dans l'espoir que quelqu'un trouve ce utile ...
Cas de Test:
Swift 4 - à Partir des Données de Chaîne Hexadécimale de
Basé sur Martin R solution mais même un tout petit peu plus rapide.
Swift 4 - De la Chaîne Hexadécimale de Données
J'ai aussi ajouté une solution rapide pour la conversion d'une Chaîne hexadécimale de Données (basé sur un C la solution).
Remarque: cette fonction ne permet pas de valider l'entrée. Assurez-vous qu'il est seulement utilisé pour les chaînes hexadécimales avec (une même quantité de caractères.
Prendre chaque octet et le convertir en hexadécimal, puis ajouter à la valeur accumulée qui commence comme une chaîne vide:
Peut-être pas le plus rapide, maisComme mentionné dans les commentaires, cette solution a été entaché d'irrégularités.data.map({ String($0, radix: 16) }).joined()
fait le travail.Data(bytes: [0x11, 0x02, 0x03, 0x44])
elle retourne la chaîne "112344" au lieu de "11020344".