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.


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

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


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


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

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.


2

Cel C:

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

Szybki:

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

1

Szybki:

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

lub .utf8jakiekolwiek odpowiednie kodowanie


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

0

w celu C:

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

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];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.