Conversion de NSData en NSString dans Objective c


87

Je veux convertir NSData en NSString .. Quelle est la meilleure façon de faire cela?

J'utilise ce code mais la chaîne finale renvoie null

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

Quand je vois la console, il affichera null.


@Nik .... @Marvin: Êtes-vous la même personne ou êtes-vous du même réseau local? Je me demande simplement pourquoi vos identicons sont exactement les mêmes.
vikingosegundo

Quelle est la ficelle? Si vous obtenez, nilje suppose que vos données ne sont pas une chaîne utf8 valide?
deanWombourne

@vikingosegundo Pour votre aimable information, je ne sais pas nik ...
Mehul Mistri

c'est vraiment drôle, car c'est extrêmement improbable. mais toujours possible.
vikingosegundo

Réponses:


47

La documentation pour NSStringdit

https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata

Valeur de retour Un objet NSString initialisé en convertissant les octets des données en caractères Unicode à l'aide du codage. L'objet retourné peut être différent du destinataire d'origine. Renvoie nil si l'initialisation échoue pour une raison quelconque (par exemple si les données ne représentent pas des données valides pour le codage).

Vous devriez essayer un autre encodage pour vérifier s'il résout votre problème

 // The following constants are provided by NSString as possible string encodings.
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};

NSASCIIStringEncoding
John Erck

J'ai utilisé les nombres dans lldb. Sinon, cela n'a pas fonctionné. Merci.
Okhan Okbay

1
Remarque: Si vous n'êtes pas sûr de votre type d'encodage ou s'il n'est pas toujours le même, cette approche vous conviendra: stackoverflow.com/a/50691430/2057171
Albert Renshaw

94

Utilisez le code ci-dessous.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

9
cela ne me donnera pas la bonne chaîne
Mehul Mistri

3
sinon, ce n'est pas le cas NSASCIIStringEncoding. voir la réponse de
Felipes

Pour cet encodage NSUTF8StringEncoding donnant nil
Shauket Sheikh

15

-[NSString initWithData:encoding]retournera nilsi le codage spécifié ne correspond pas au codage des données.

Assurez-vous que vos données sont encodées en UTF-8 (ou remplacez NSUTF8StringEncoding par le codage approprié pour les données).


J'ai converti une image en NSdata et à nouveau converti les NSdata en String à l'aide de NSUTF8StringEncoding. Mais il est nul.
Ramakrishna

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
Cela ne fonctionne pas comme décrit [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] fonctionne
Ryan Heitner

2

-[NSString initWithData:encoding] est votre ami mais uniquement lorsque vous utilisez un encodage approprié.


2

Objectif c:

[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

Rapide:

let str = String(data: data, encoding: .ascii)

1

Rapide:

let jsonString = String(data: jsonData, encoding: .ascii)

ou .utf8tout autre encodage approprié


1

Vous n'êtes pas sûr du type de codage des données? Aucun problème!

Sans avoir besoin de connaître les types de codage potentiels, dans lesquels de mauvais types de codage vous donneront nil / null, cela devrait couvrir toutes vos bases:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Terminé!




Remarque: en cas d'échec, vous pouvez décompresser votre NSData avec NSKeyedUnarchiver , puis reconditionner le (id)unpackedvia NSKeyedArchiver, et ce formulaire NSData devrait être encodable en base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

dans l'objectif C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

celui-ci est faux, il retournera quelque chose comme {length = XX, bytes = 0xYYYYYYYY}et je suppose que la question était de savoir comment déballer la chaîne codée des octets bruts, pas leur description
raistlin

0

Objective C inclut un moyen intégré de détecter le codage d'une chaîne incorporée dans NSData.

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
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.