Konvertieren von NSData in NSString in Objective c

87

Ich möchte NSData in NSString konvertieren. Was ist der beste Weg, dies zu tun?

Ich verwende diesen Code, aber die letzte Zeichenfolge gibt null zurück

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

Wenn ich die Konsole sehe, wird null ausgegeben.

Mehul Mistri
quelle
@Nik .... @Marvin: Bist du dieselbe Person oder aus derselben Sprache? Ich frage mich nur, warum Ihre Identicons genau gleich sind.
Vikingosegundo
Was ist die Saite? Wenn Sie nildann bekommen, denke ich, dass Ihre Daten keine gültige utf8-Zeichenfolge sind?
DeanWombourne
@vikingosegundo Zu Ihrer Information weiß ich nicht, nik ...
Mehul Mistri
das ist wirklich lustig, da es äußerst unwahrscheinlich ist. aber immer noch möglich.
Vikingosegundo

Antworten:

47

Die Dokumentation für NSStringsagt

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

Rückgabewert Ein NSString-Objekt, das durch Konvertieren der Bytes in Daten in Unicode-Zeichen mithilfe der Codierung initialisiert wurde. Das zurückgegebene Objekt kann sich vom ursprünglichen Empfänger unterscheiden. Gibt null zurück, wenn die Initialisierung aus irgendeinem Grund fehlschlägt (z. B. wenn Daten keine gültigen Daten für die Codierung darstellen).

Sie sollten eine andere Codierung ausprobieren, um zu überprüfen, ob Ihr Problem dadurch behoben wird

 // 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
quelle
NSASCIIStringEncoding
John Erck
Ich habe die Zahlen in lldb verwendet. Sonst hat es nicht funktioniert. Vielen Dank.
Okhan Okbay
1
Hinweis: Wenn Sie sich über Ihren Codierungstyp nicht sicher sind oder dieser nicht immer gleich ist, ist dieser Ansatz gut für Sie: stackoverflow.com/a/50691430/2057171
Albert Renshaw
92

Verwenden Sie den folgenden Code.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Jhaliya
quelle
9
Dies wird mir nicht die richtige Saite geben
Mehul Mistri
3
wenn nicht, ist es nicht NSASCIIStringEncoding. siehe felipes Antwort für andere Kodierungen
vikingosegundo
15

-[NSString initWithData:encoding]wird zurückgegeben, nilwenn die angegebene Codierung nicht mit der Codierung der Daten übereinstimmt.

Stellen Sie sicher, dass Ihre Daten in UTF-8 codiert sind (oder ändern Sie NSUTF8StringEncoding in die für die Daten geeignete Codierung).

Morten schnell
quelle
Ich habe ein Bild in die NS-Daten konvertiert und die NS-Daten mithilfe der NSUTF8StringEncoding erneut in den String konvertiert. Aber es zeigt nichts.
Ramakrishna
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Nag Raj
quelle
1
Dies funktioniert nicht wie beschrieben. [[NSString alloc] initWithData: head encoding: NSUTF8StringEncoding] funktioniert
Ryan Heitner
2

-[NSString initWithData:encoding] ist dein Freund, aber nur, wenn du eine richtige Kodierung verwendest.

Bilal Khan
quelle
2

Ziel c:

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

Schnell:

let str = String(data: data, encoding: .ascii)
Alexander Volkov
quelle
1

Schnell:

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

oder .utf8oder welche Kodierung auch immer angemessen ist

Jess
quelle
1

Sie sind sich des Codierungstyps der Daten nicht sicher? Kein Problem!

Ohne potenzielle Codierungstypen kennen zu müssen, bei denen falsche Codierungstypen Null / Null ergeben, sollte dies alle Ihre Grundlagen abdecken:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Getan!




Hinweis: Falls dies irgendwie fehlschlägt, können Sie Ihre NSData mit entpacken NSKeyedUnarchiver und dann (id)unpackederneut über NSKeyedArchiverpacken. Das NSData-Formular sollte base64-codierbar sein.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Albert Renshaw
quelle
0

in Ziel C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R.
quelle
Dieser ist falsch, er wird so etwas wie zurückgeben {length = XX, bytes = 0xYYYYYYYY}und ich nehme an, die Frage war, wie man einen codierten String aus rohen Bytes
entpackt
0

Ziel C enthält eine integrierte Methode zum Erkennen der Codierung einer in NSData eingebetteten Zeichenfolge.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Andrew Rondeau
quelle