Je veux convertir NSData en NSString..Quel est le meilleur moyen de le faire?
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, elle imprimera null.
La documentation pour NSString
dit
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 de l'encodage. L'objet retourné peut être différent du destinataire d'origine. Renvoie la valeur 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
};
Utilisez le code ci-dessous.
NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
-[NSString initWithData:encoding]
retournera nil
si le codage spécifié ne correspond pas au codage des données.
Assurez-vous que vos données sont codées en UTF-8 (ou remplacez NSUTF8StringEncoding par un codage approprié pour les données).
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
-[NSString initWithData:encoding]
est votre ami, mais uniquement lorsque vous utilisez un codage approprié.
en objectif C:
NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Sans avoir besoin de connaître les types de codage potentiels, dans lesquels des types de codage incorrects vous donneront la valeur nil/null, cela devrait couvrir toutes vos bases:
NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
Fait!
Remarque: Si cela échouait, vous pouvez décompresser votre NSData avec NSKeyedUnarchiver
, puis remballer le (id)unpacked
à nouveau via NSKeyedArchiver
, et ce formulaire NSData devrait être codable en base 64.
id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Objectif c:
[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Rapide:
let str = String(data: data, encoding: .ascii)
Rapide:
let jsonString = String(data: jsonData, encoding: .ascii)
ou .utf8
ou tout codage approprié