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.

Mehul Mistri
la source
@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
};
Felipe Sabino
la source
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];
Jhaliya
la source
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).

Morten Fast
la source
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]];
Nag Raj
la source
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é.

Bilal Khan
la source
2

Objectif c:

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

Rapide:

let str = String(data: data, encoding: .ascii)
Alexandre Volkov
la source
1

Rapide:

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

ou .utf8tout autre encodage approprié

Jess
la source
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];
Albert Renshaw
la source
0

dans l'objectif C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R
la source
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];
Andrew Rondeau
la source