La conversion de Chaîne Hexadécimale à NSData en Swift
J'ai obtenu le code de convertir la Chaîne de HEX-String en objective-C.
- (NSString *) CreateDataWithHexString:(NSString*)inputString
{
NSUInteger inLength = [inputString length];
unichar *inCharacters = alloca(sizeof(unichar) * inLength);
[inputString getCharacters:inCharacters range:NSMakeRange(0, inLength)];
UInt8 *outBytes = malloc(sizeof(UInt8) * ((inLength / 2) + 1));
NSInteger i, o = 0;
UInt8 outByte = 0;
for (i = 0; i < inLength; i++) {
UInt8 c = inCharacters[i];
SInt8 value = -1;
if (c >= '0' && c <= '9') value = (c - '0');
else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A');
else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a');
if (value >= 0) {
if (i % 2 == 1) {
outBytes[o++] = (outByte << 4) | value;
outByte = 0;
} else {
outByte = value;
}
} else {
if (o != 0) break;
}
}
NSData *a = [[NSData alloc] initWithBytesNoCopy:outBytes length:o freeWhenDone:YES];
NSString* newStr = [NSString stringWithUTF8String:[a bytes]];
return newStr;
}
Je veux le même en Swift. Quelqu'un peut-il traduire ce code en Swift, ou est-il un moyen facile de le faire dans Swift?
Vous devez vous connecter pour publier un commentaire.
C'est ma chaîne hexadécimale à
Data
routine:Et par souci d'exhaustivité, c'est mon
Data
de chaîne hexadécimale de routine:Remarque, comme indiqué ci-dessus, de manière générale, j'seulement de convertir des entre des représentations hexadécimales et
NSData
cas (parce que si l'information pourrait avoir été représenté comme une chaîne de caractères, vous probablement n'aurait pas créé une représentation hexadécimale en premier lieu). Mais votre question initiale voulu convertir entre les représentations hexadécimales etString
les objets, et qui pourrait ressembler à de la sorte:Vous pouvez ensuite utiliser le ci-dessus comme suit:
Ou,
Pour les permutations de la ci-dessus pour plus tôt Swift versions, voir l'historique de la révision de cette question.
extension NSData { /// Create hexadecimal string representation of NSData object. /// /// :returns: String representation of this NSData object. func hexadecimalString() -> String { var string = NSMutableString(capacity: length * 2) var byte: Byte? for i in 0 ..< length { getBytes(&byte, range: NSMakeRange(i, 1)) string.appendFormat("%02x", byte!) } return string } }
Cela semble un crash dans l'Swift 1.2...essayer de comprendre pourquoi.let string = "Hello السلام عليكم"
etlet hex = string.hexadecimalString()!
etlet string2 = String(hexadecimal: hex)!
. Il fonctionne très bien. Vous avez besoin de nous montrer un exemple qui ne fonctionne pas. Je vous suggère de poster votre propre question de nous montrer un exemple qui fonctionne très bien. Je parie que vous avez affaire à une chaîne hexadécimale qui n'est pas valide UTF8 représentation, mais je ne peux pas dire sans la voir. Et nous ne devrions pas utiliser les commentaires ici pour gérer ce genre de Q&A, donc, il vous suffit de poster votre propre question.convertir en chaîne hexadécimale de données et à la chaîne:
Swift1
utilisation:
Swift2
utilisation:
Swift3
utilisation:
Swift4
utilisation:
Swift 4 & Swift 5 mise en œuvre:
Utilisation:
hexString[j..<j+2]
. Vous avez probablement un indice quelque part ou à partir d'une extensionVoici une solution simple que j'ai réglé sur:
Utilisation:
De sortie:
Mise à jour 6/29/2016
J'ai mis à jour l'initialiseur de gérer des données malformées (c'est à dire, les caractères non valides ou un nombre impair de caractères).
Ici est mon point de vue sur la conversion de la chaîne hexadécimale de Données à l'aide de Swift 4:
(J'y ai ajouté une petite fonction pour convertir retour à la chaîne hexadécimale j'ai trouvé dans cette réponse)
Et voici comment vous pouvez l'utiliser:
Le code a fonctionné pour moi dans Swift 3.0.2.