Konwersja NSData do NSString w celu c

87

Chcę przekonwertować NSData na NSString .. Jaki jest najlepszy sposób, aby to zrobić?

Używam tego kodu, ale końcowy ciąg zwraca wartość null

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

Kiedy zobaczę konsolę, to wypisze null.

Mehul Mistri
źródło
@Nik .... @Marvin: Czy jesteś tą samą osobą czy z tej samej sieci LAN? Zastanawiam się tylko, dlaczego twoje tożsamości są dokładnie takie same.
vikingosegundo
Co to za sznurek? Jeśli otrzymujesz, nilto myślę, że twoje dane nie są prawidłowym ciągiem utf8?
dziekan Wombourne
@vikingosegundo Dla waszej uprzejmej informacji nie znam nik ...
Mehul Mistri
to jest naprawdę zabawne, ponieważ jest bardzo mało prawdopodobne. ale nadal możliwe.
vikingosegundo

Odpowiedzi:

47

Dokumentacja NSStringmówi

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

Wartość zwracana Obiekt NSString zainicjowany przez konwersję bajtów danych na znaki Unicode przy użyciu kodowania. Zwrócony obiekt może różnić się od pierwotnego odbiorcy. Zwraca nil, jeśli inicjalizacja z jakiegoś powodu nie powiedzie się (na przykład, jeśli dane nie reprezentują prawidłowych danych do zakodowania).

Powinieneś wypróbować inne kodowanie, aby sprawdzić, czy to rozwiąże problem

 // 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
źródło
NSASCIIStringEncoding
John Erck
Użyłem liczb w lldb. W przeciwnym razie to nie zadziałało. Dzięki.
Okhan Okbay,
1
Uwaga: Jeśli nie masz pewności co do typu kodowania lub jeśli nie zawsze jest to to samo, to podejście będzie dla Ciebie dobre: stackoverflow.com/a/50691430/2057171
Albert Renshaw
94

Użyj poniższego kodu.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Jhaliya
źródło
9
to nie da mi właściwego ciągu
Mehul Mistri
3
jeśli nie, to nie jest NSASCIIStringEncoding. zobacz odpowiedź felipes dla innych kodowań
vikingosegundo
Do tego kodowania NSUTF8StringEncoding dając zero
Shauket Sheikh
15

-[NSString initWithData:encoding]zwróci wartość, niljeśli określone kodowanie nie pasuje do kodowania danych.

Upewnij się, że Twoje dane są zakodowane w UTF-8 (lub zmień NSUTF8StringEncoding na dowolne kodowanie, które jest odpowiednie dla danych).

Morten Fast
źródło
Przekonwertowałem obraz na NSdata i ponownie przekonwertowałem NSdata na String przy użyciu NSUTF8StringEncoding. Ale pokazuje zero.
Ramakrishna
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Nag Raj
źródło
1
To nie działa zgodnie z opisem [[NSStringocation] initWithData: head encoding: NSUTF8StringEncoding] działa
Ryan Heitner
2

-[NSString initWithData:encoding] jest twoim przyjacielem, ale tylko wtedy, gdy używasz odpowiedniego kodowania.

Bilal Khan
źródło
2

Cel C:

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

Szybki:

let str = String(data: data, encoding: .ascii)
Alexander Volkov
źródło
1

Szybki:

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

lub .utf8jakiekolwiek odpowiednie kodowanie

Pęto
źródło
1

Nie masz pewności co do typu kodowania danych? Nie ma problemu!

Bez potrzeby znajomości potencjalnych typów kodowania, w których niewłaściwe typy kodowania dadzą ci zero / zero, powinno to obejmować wszystkie twoje bazy:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Gotowe!




Uwaga: jeśli to się nie powiedzie, możesz rozpakować swoje NSData za pomocą NSKeyedUnarchiver , a następnie przepakować (id)unpackedponownie via NSKeyedArchiver, a formularz NSData powinien być kodowany w base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Albert Renshaw
źródło
0

w celu C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R
źródło
ten jest zły, zwróci coś podobnego {length = XX, bytes = 0xYYYYYYYY}i zakładam, że pytanie brzmi, jak rozpakować zakodowany ciąg z surowych bajtów, a nie ich opis
raistlin
0

Cel C zawiera wbudowany sposób wykrywania kodowania ciągu osadzonego w NSData.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Andrew Rondeau
źródło