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.