Mengubah NSData ke NSString di Tujuan c

87

Saya ingin mengkonversi NSData ke NSString..Apa cara terbaik untuk melakukan ini?

Saya menggunakan kode ini tetapi string terakhir mengembalikan null

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

Ketika saya melihat konsol Ini akan mencetak null.

Mehul Mistri
sumber
@Nik .... @Marvin: Apakah Anda orang yang sama atau dari dalam lan yang sama? Saya hanya ingin tahu, mengapa identitas Anda persis sama.
vikingosegundo
Apa senarnya? Jika Anda mendapatkan nilmaka saya kira data Anda bukan string utf8 yang valid?
deanWombourne
@vikingosegundo Untuk informasi baik Anda, saya tidak tahu nik ...
Mehul Mistri
itu sangat lucu, karena sangat tidak mungkin. tapi masih memungkinkan.
vikingosegundo

Jawaban:

47

Dokumen untuk NSStringkata

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

Nilai Kembali Objek NSString diinisialisasi dengan mengubah byte dalam data menjadi karakter Unicode menggunakan pengkodean. Objek yang dikembalikan mungkin berbeda dari penerima asli. Menampilkan nil jika inisialisasi gagal karena beberapa alasan (misalnya jika data tidak mewakili data yang valid untuk pengkodean).

Anda harus mencoba pengkodean lain untuk memeriksa apakah itu menyelesaikan masalah Anda

 // 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
sumber
NSASCIIStringEncoding
John Erck
Saya menggunakan nomor di lldb. Jika tidak, itu tidak berhasil. Terima kasih.
Okhan Okbay
1
Catatan: Jika Anda tidak yakin dengan jenis pengkodean Anda atau jika tidak selalu sama, pendekatan ini akan baik untuk Anda: stackoverflow.com/a/50691430/2057171
Albert Renshaw
94

Gunakan kode di bawah ini.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
Jhaliya
sumber
9
ini tidak akan memberi saya string yang tepat
Mehul Mistri
3
jika tidak, maka tidak NSASCIIStringEncoding. lihat jawaban felipes untuk pengkodean lainnya
vikingosegundo
Untuk pengkodean ini NSUTF8StringEncoding memberi nihil
Shauket Sheikh
15

-[NSString initWithData:encoding]akan kembali niljika pengkodean yang ditentukan tidak cocok dengan pengkodean data.

Pastikan data Anda dienkode dalam UTF-8 (atau ubah NSUTF8StringEncoding menjadi encoding apa pun yang sesuai untuk data tersebut).

Morten Fast
sumber
Saya mengubah gambar menjadi NSdata dan sekali lagi mengubah NSdata menjadi String menggunakan NSUTF8StringEncoding. Tapi hasilnya nihil.
Ramakrishna
6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
Nag Raj
sumber
1
Ini tidak berfungsi seperti yang dijelaskan [[NSString alokasi] initWithData: head encoding: NSUTF8StringEncoding] berfungsi
Ryan Heitner
2

-[NSString initWithData:encoding] adalah teman Anda, tetapi hanya jika Anda menggunakan pengkodean yang tepat.

Bilal Khan
sumber
2

Tujuan C:

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

Cepat:

let str = String(data: data, encoding: .ascii)
Alexander Volkov
sumber
1

Cepat:

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

atau .utf8atau pengkodean apa pun yang sesuai

Jess
sumber
1

Tidak yakin dengan jenis pengkodean data? Tidak masalah!

Tanpa perlu mengetahui jenis pengkodean potensial, di mana jenis pengkodean yang salah akan memberi Anda nil / null, ini harus mencakup semua basis Anda:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Selesai!




Catatan: Dalam hal ini entah bagaimana gagal, Anda dapat membongkar NSData Anda dengan NSKeyedUnarchiver , lalu mengemas (id)unpackedulang melalui NSKeyedArchiver, dan formulir NSData harus dapat dienkode dengan base64.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Albert Renshaw
sumber
0

dalam tujuan C:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
Ashok R
sumber
yang ini salah, itu akan mengembalikan sesuatu seperti {length = XX, bytes = 0xYYYYYYYY}dan saya berasumsi pertanyaannya adalah bagaimana membuka bungkus string yang disandikan dari byte mentah, bukan deskripsi mereka
raistlin
0

Objective C menyertakan cara built-in untuk mendeteksi encoding dari string yang tertanam di NSData.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Andrew Rondeau
sumber