NSData'yı Hedef c'de NSString'e dönüştürme


87

NSData'yı NSString'e dönüştürmek istiyorum .. Bunu yapmanın en iyi yolu nedir?

Bu kodu kullanıyorum ama son dize null döndürüyor

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

Konsolu gördüğümde boş yazacak.


@Nik .... @Marvin: Aynı kişi misiniz yoksa aynı lan içinde misiniz? Merak ediyorum, kimlikleriniz neden tamamen aynı.
vikingosegundo

İp nedir? Eğer nilalıyorsanız, sanırım verileriniz geçerli bir utf8 dizesi değil?
deanWombourne

@vikingosegundo Nazik bilgin için nik bilmiyorum ...
Mehul Mistri

bu gerçekten komik, çünkü son derece olası değil. ama yine de mümkün.
vikingosegundo

Yanıtlar:


47

NSStringDiyor için dokümanlar

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

Dönüş Değeri Verilerdeki baytları kodlama kullanılarak Unicode karakterlere dönüştürülerek başlatılan bir NSString nesnesi. İade edilen nesne orijinal alıcıdan farklı olabilir. Başlatma herhangi bir nedenle başarısız olursa sıfır döndürür (örneğin, veriler kodlama için geçerli verileri temsil etmiyorsa).

Sorununuzu çözüp çözmediğini kontrol etmek için diğer kodlamaları denemelisiniz

 // 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

Lldb'deki sayıları kullandım. Aksi takdirde işe yaramadı. Teşekkürler.
Okhan Okbay

1
Not: Kodlama türünüzden emin değilseniz veya her zaman aynı değilse, bu yaklaşım sizin için iyi olacaktır: stackoverflow.com/a/50691430/2057171
Albert Renshaw


15

-[NSString initWithData:encoding]nilBelirtilen kodlama verilerin kodlamasıyla eşleşmiyorsa döndürülür .

Verilerinizin UTF-8'de kodlandığından emin olun (veya NSUTF8StringEncoding'i veriler için uygun olan kodlamaya değiştirin).


Bir görüntüyü NSdata'ya dönüştürdüm ve NSUTF8StringEncoding kullanarak NSdata'yı tekrar String'e dönüştürdüm. Ama sıfır gösteriyor.
Ramakrishna

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
Bu, açıklandığı gibi çalışmaz [[NSString ayırma] initWithData: head kodlama: NSUTF8StringEncoding] çalışır
Ryan Heitner

2

-[NSString initWithData:encoding] arkadaşınız, ancak yalnızca uygun bir kodlama kullandığınızda.


2

Hedef C:

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

Swift:

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

1

Swift:

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

veya .utf8veya uygun olan kodlama


1

Verilerin kodlama türünden emin değil misiniz? Sorun değil!

Yanlış kodlama türlerinin size nil / null vereceği olası kodlama türlerini bilmenize gerek kalmadan, bu tüm temellerinizi kapsamalıdır:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Bitti!




Not: Bunun bir şekilde başarısız olması durumunda, NSData'nızı paketinden çıkarabilir NSKeyedUnarchiver , ardından (id)unpackedtekrar paketleyebilirsiniz NSKeyedArchiverve bu NSData formunun base64 kodlanabilir olması gerekir.

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

C hedefinde:

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

bu yanlış, bunun gibi bir şey döndürecek {length = XX, bytes = 0xYYYYYYYY}ve sanırım kodlanmış dizgenin açıklamaları değil, ham baytlardan nasıl açılacağıydı
raistlin

0

Hedef C, NSData'ya gömülü bir dizenin kodlamasını algılamak için yerleşik bir yol içerir.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.