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.
iphone
objective-c
ios
ipad
Mehul Mistri
źródło
źródło
nil
to myślę, że twoje dane nie są prawidłowym ciągiem utf8?Odpowiedzi:
Dokumentacja
NSString
mówihttps://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata
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 };
źródło
NSASCIIStringEncoding
Użyj poniższego kodu.
NSString* myString; myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
źródło
NSASCIIStringEncoding
. zobacz odpowiedź felipes dla innych kodowań-[NSString initWithData:encoding]
zwróci wartość,nil
jeś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).
źródło
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
źródło
-[NSString initWithData:encoding]
jest twoim przyjacielem, ale tylko wtedy, gdy używasz odpowiedniego kodowania.źródło
Cel C:
[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Szybki:
źródło
Szybki:
lub
.utf8
jakiekolwiek odpowiednie kodowanieźródło
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)unpacked
ponownie viaNSKeyedArchiver
, a formularz NSData powinien być kodowany w base64.id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data]; data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
źródło
NSData *tmpData; NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData]; NSLog(tmpString)
źródło
{length = XX, bytes = 0xYYYYYYYY}
i zakładam, że pytanie brzmi, jak rozpakować zakodowany ciąg z surowych bajtów, a nie ich opisCel 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];
źródło