La conversion de NSData en Entier en Swift
En Objective-C du code regardé aimé ce et a fonctionné parfaitement,
NSInteger random = arc4random_uniform(99) + 1
NSData *data = [NSData dataWithBytes:& random length: sizeof(random)];
int value = *(int*)([data bytes]);
Comment cela peut-il être fait dans Swift?
OriginalL'auteur dhint4 | 2014-10-07
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
ou
sizeofValue(random)
Dans Swift3: sizeof(NSInteger) devient MemoryLayout<NSInteger>.la taille et la println devient d'impression.
Notez que pour obtenir la taille directement à partir du type de l'objet dans Swift 3 ou version ultérieure de
sizeofValue
estMemoryLayout.size(ofValue: value)
OriginalL'auteur findall
Dans Swift 4:
Il ya un couple de choses à considérer lors de l'extraction d'une valeur de nombre entier à partir d'un
Data
flux. Ce paramètre et Endianess. Donc, je suis venu avec une fonction dans une extension deData
qui déduit ce paramètre du type d'entier que vous voulez extraire et passe Endianess etIndex
en tant que paramètres. Les types d'entiers qui peuvent être extraites sont tous conformes à laFixedWidthInteger
protocole.Rappel: Cette fonction ne vérifie pas si le
Index
gamme est à l'intérieur des limites de laData
tampon de sorte qu'il peut se bloquer en fonction de la taille du type de l'extraction par rapport à la fin de la mémoire tampon.Exemple:
Résultats:
number1 is 8191
number2 is 65311
number3 is -225
number4 is 8191
Observer les appels de fonction pour voir comment le type extrait est déduite. Bien sûr Endianess ne fait pas de sens pour
Int8
ouUInt8
, mais la fonction fonctionne comme prévu.Valeurs peuvent ensuite être jeté à
Int
si nécessaire.La façon la plus simple d'obtenir un
UInt8
est de simplement utiliser un indice si vous savez exactement à l'index de l'octet que vous voulez:data[index]
Data.Index
à l'intérieur d'unData
extension est redondante. Utiliser seulementIndex
OriginalL'auteur Gustavo Seidler
Pour Swift 3, vous pouvez le faire (petit-boutiste, mais similaire pour les grands):
Vous pouvez modifier, ajouter les génériques, etc. pour s'adapter à d'autres types primitifs (et varient en fonction de l'endianness des octets de données).
OriginalL'auteur benasher44
Vous pourriez trouver cette méthode utile si vous faites beaucoup de choses:
La fonction prend comme paramètre la position de départ dans les données à lire le type numérique et elle renvoie une valeur de type inféré à partir de ce que vous êtes en l'assignant à.
Par exemple:
lit un 4 octets entier à partir de la position 10 dans les données.
Si vous modifiez
UInt32
àUInt16
il va lire deux octets.OriginalL'auteur rghome
Données entier merci @rghome
OriginalL'auteur YannickSteph
Ma contribution avec une swift 3.1 extension :
Appelez simplement .int pour obtenir votre valeur, juste comme ça :
OriginalL'auteur Kevin ABRIOUX
Vous pouvez prolonger le protocole de Données, créer un générique metho, retourner les octets de la mémoire de données de la mémoire et de le jeter ou de définir le type obtenu explicitement en tant que de besoin:
Tests avec
Int
Tests avec
UInt32
Tests avec Double
Si vous voulez extraire une subdata simplement indice de vos données:
OriginalL'auteur Leo Dabus