NSString değerini NSData'ya nasıl dönüştürebilirim?


Yanıtlar:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

UTF-8 veya UTF-32 gibi daha yüksek bir şeyin aksine UTF-8 kullanmanın avantajları ve dezavantajları nelerdir?
Albert Renshaw

4
NSData, UTF-8 mi yoksa UTF-16 mı yoksa UTF-32 mi olduğunu pek umursamıyor. İki sorun vardır: Bir, UTF-16 ve UTF-32'nin doğru bayt sırasına sahip olması gerekir. İkincisi, onu bir NSString * 'e geri çeviren kişi kodlamayı bilmelidir ve genellikle UTF-8 kodlamasını varsayar. Genellikle, UTF-8'in doğru bir şekilde ele alınması muhtemeldir.
gnasher729

1
@bendytree aslında hayır, -dataUsingEncoding: null sonlandırılmamış bir dize döndürür. Onu geri dönüştüren şey: -initWithData: encoding :.
Psiko

1
@Albert Renshaw şu anda (bu şekilde kalan şeylerin garantisi yok) NSStringdahili olarak UTF-16 kullanıyor, bu nedenle UTF-16 <-> UTF-8 dönüşümü yapmak zorunda olmadığı için küçük bir performans kazancı olabilir. Şahsen, performans üzerinde sağlamlığı tercih ediyoruz (@ gnasher729'un önerdiği gibi) ve her yerde UTF-8 kullanıyoruz.
Bazı Geliştirici

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

bu linkten referans alabilirsiniz


3
Bir astar çözümü:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor

32

Yapmak:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

o zaman devam etmekte özgürsün NSJSONSerialization:JSONObjectWithData .


NULL sonlandırıcı ile ilgili cevaba düzeltme

Yorumların, resmi belgelerin ve doğrulamaların ardından, NULL olduğu iddia edilen bir sonlandırıcının kaldırılmasıyla ilgili bu cevap güncellendi:

  1. DataUsingEncoding tarafından belgelendiği gibi :

    Geri dönüş değeri

    dataUsingEncoding:allowLossyConversion:İkinci argüman olarak NO ile çağrılmanın sonucu

  2. GetCString: maxLength: encoding: and cStringUsingEncoding: tarafından belgelendiği gibi :

    NULL sonlandırıcısı olmadığı için döndürülen verilerin dataUsingEncoding:allowLossyConversion:katı bir C-dizesi olmadığını unutmayın


14
Bu yanlış! Lütfen
yazımı

4
Evet. dataUsingEncoding:boş sonlandırılmış veriler döndürmez. Yalnızca UTF8Stringve bir C dizesi döndüren diğer yöntemler boş değerli bir dizge döndürür.
Peter Hosey

@PeterHosey Bunun için herhangi bir kaynağınız var mı? Bunu herhangi bir dokümanda bulmakta zorlanıyorum.
shortstuffsushi

1
Teşekkür @PeterHosey, dokümanlar orada bağlantılı do açıkça BOŞ fesih eksikliği devlet - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Bunu daha önce özlemeliydim. Yine de gelecekte bir şey yazacağımdan emin olacağım.
shortstuffsushi

1
(Merak eden herkes için: shortstuffsushi'nin teklifi altında cStringUsingEncoding:. Ben bakıyordum dataUsingEncoding:.)
Peter Hosey

20

Swift Geliştirici'nin buraya gelmesi durumunda,

/ String için NSData dönüştürmek için

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objective-C:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Swift:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

Muhtemelen işlemci yoğunluğu diğer yöntemlerle karşılaştırıldığında, ancak dosya sistemine kalıcılık için erişiyorsanız çok kullanışlıdır
Stephen J

10

İlk önce, dataUsingEncoding:geçmek yerine kullanmalısınız UTF8String. Yalnızca bu kodlamada UTF8Stringbir Cdizeye ihtiyacınız olduğunda kullanılır .

Ardından için UTF-16, sadece geçmesi NSUnicodeStringEncodingyerine NSUTF8StringEncodingsizin de dataUsingEncoding:mesajın.


7

Swift 3 için, çoğunlukla 'dan' Stringya dönüşürsünüz Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
str127'den büyük kod noktaları içerdiğinde bu yanıt yanlıştır. Bunun nedeni str.lengthbayt sayısını değil Unicode karakter sayısını vermesidir. Örneğin, strbir @"にほんご", str.lengthsüre 4'ü verir str.UTF8Stringaslında 12 bayt içerir. Değiştirmeye bile str.lengthtarafından strlen(str.UTF8String), yine de durum için yanlış olacaktır strgibi NULL karakteri içerir @"にほ\0んご".
Pang

Bu şekilde oluşturulan bir NSData nesnesi, [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableLeaves hatası: & error];
Adobels

2

Objective-C:

NSData'ya NSString:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData'dan NSString'e:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Swift:

Veri Dizesi:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

Dizeye Veriler:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

Objective-C

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

hızlı

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
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.