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.


@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
};

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];

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).


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]];

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.


2

Ziel c:

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

Schnell:

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

1

Schnell:

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

oder .utf8oder welche Kodierung auch immer angemessen ist


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];

0

in Ziel C:

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

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];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.