Comment convertir une valeur NSString en NSData?


Réponses:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

Quels sont les avantages et les inconvénients de l'utilisation de l'UTF-8 par rapport à quelque chose de plus élevé comme UTF-16 ou UTF-32?
Albert Renshaw

4
Le NSData ne se soucie pas beaucoup de savoir s'il s'agit de UTF-8 ou UTF-16 ou UTF-32. Il y a deux problèmes: un, UTF-16 et UTF-32 doivent avoir le bon ordre des octets. Deuxièmement, celui qui la reconvertit en NSString * doit connaître le codage et assume souvent le codage UTF-8. Généralement, UTF-8 est le plus susceptible d'être géré correctement.
gnasher729

1
@bendytree en fait non, il ne le fait pas, -dataUsingEncoding: renverra une chaîne non terminée par null qui est ce que stringWithUTF8String: requiert, vous êtes obligé de lire la mémoire que vous ne voulez pas. Ce qui le reconvertit est: -initWithData: encoding :.
Psycho

1
@Albert Renshaw actuellement (aucune garantie que les choses restent ainsi) NSStringutilise UTF-16 en interne, il peut donc y avoir un léger gain de performances car il n'a pas à faire de conversion UTF-16 <-> UTF-8. Personnellement, nous préférons (comme le suggère @ gnasher729) la robustesse aux performances et utilisons UTF-8 partout.
Un développeur

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

vous pouvez prendre référence à partir de ce lien


3
Une solution de revêtement:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

Faire:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

alors n'hésitez pas à continuer NSJSONSerialization:JSONObjectWithData.


Correction de la réponse concernant le terminateur NULL

Suite aux commentaires, à la documentation officielle et aux vérifications , cette réponse a été mise à jour concernant la suppression d'un prétendu terminateur NULL:

  1. Comme documenté par dataUsingEncoding ::

    Valeur de retour

    Le résultat de l'invocation dataUsingEncoding:allowLossyConversion:de NO comme deuxième argument

  2. Tel que documenté par getCString: maxLength: encoding: et cStringUsingEncoding ::

    notez que les données retournées par dataUsingEncoding:allowLossyConversion:ne sont pas une chaîne C stricte car elles n'ont pas de terminateur NULL


14
C'est faux! Veuillez consulter mon article ici: stackoverflow.com/q/14087094/192819
jpswain

4
Ouaip. dataUsingEncoding:ne renvoie pas de données terminées par null. Seules les UTF8Stringautres méthodes qui renvoient une chaîne C renvoient une chaîne terminée par null.
Peter Hosey

@PeterHosey avez-vous une source pour cela? J'ai du mal à trouver cela dans tous les documents.
shortstuffsushi

1
Merci @PeterHosey, les documents que vous avez lié il ne stipulent explicitement l'absence de résiliation NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). J'ai dû manquer ça plus tôt. Je serai sûr d'écrire quoi que ce soit à l'avenir, cependant.
shortstuffsushi

1
(Pour tous ceux qui se demandent: la citation de shortstuffsushi est en dessous cStringUsingEncoding:. Je regardais en dessous dataUsingEncoding:.)
Peter Hosey

20

Si Swift Developer vient ici,

pour convertir de NSString / String en NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objectif c:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Rapide:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

Probablement gourmand en processeur par rapport aux autres méthodes, mais très utile si vous accédez au système de fichiers pour la persistance
Stephen J

10

Tout d'abord, vous devez utiliser dataUsingEncoding:au lieu de passer par UTF8String. Vous utilisez uniquement UTF8Stringlorsque vous avez besoin d'une Cchaîne dans cet encodage.

Ensuite, pour UTF-16, passez simplement NSUnicodeStringEncodingau lieu de NSUTF8StringEncodingdans votre dataUsingEncoding:message.


7

Pour Swift 3, vous effectuerez principalement la conversion de Stringà Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
Cette réponse est incorrecte lorsque strcontient des points de code supérieurs à 127. Cela est dû au fait qu'il str.lengthdonne le nombre de caractères Unicode, pas le nombre d'octets. Par exemple, si strest @"にほんご", str.lengthdonne 4 alors str.UTF8Stringqu'il contient en fait 12 octets. Même si vous remplacez str.lengthpar strlen(str.UTF8String), il sera toujours incorrect pour le cas où strcontient le caractère NULL, tel que @"にほ\0んご".
Pang

Un objet NSData créé de cette manière lève une exception lors de l'utilisation avec [NSJSONSerialization JSONObjectWithData: options de données: NSJSONReadingMutableLeaves error: & error];
Adobels

2

Objectif c:

NSString à NSData:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData à NSString:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Rapide:

Chaîne en données:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

Données à chaîne:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

Objectif c

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

Rapide

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.