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.


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

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

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


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

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.


2

Tujuan C:

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

Cepat:

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

1

Cepat:

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

atau .utf8atau pengkodean apa pun yang sesuai


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

0

dalam tujuan C:

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

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];
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.