Chuyển đổi NSData sang NSString trong Objective c


87

Tôi muốn chuyển đổi NSData sang NSString..Cách tốt nhất để thực hiện việc này là gì?

Tôi đang sử dụng mã này nhưng chuỗi cuối cùng trả về null

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

Khi tôi nhìn thấy bảng điều khiển Nó sẽ in null.


@Nik .... @Marvin: Bạn là cùng một người hay từ trong cùng một lan? Tôi chỉ tự hỏi, tại sao bạn identicons là giống hệt nhau.
vikingosegundo

Chuỗi là gì? Nếu bạn nhận được nilthì tôi đoán dữ liệu của bạn không phải là một chuỗi utf8 hợp lệ?
deanWombourne

@vikingosegundo Để biết thông tin của các bạn tôi không biết nik ...
Mehul Mistri

điều đó thực sự buồn cười, vì nó rất khó xảy ra. nhưng vẫn có thể.
vikingosegundo

Câu trả lời:


47

Các tài liệu cho NSStringnói

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

Giá trị trả về Một đối tượng NSString được khởi tạo bằng cách chuyển đổi các byte trong dữ liệu thành các ký tự Unicode bằng cách sử dụng mã hóa. Đối tượng trả về có thể khác với đối tượng nhận ban đầu. Trả về nil nếu quá trình khởi tạo không thành công vì lý do nào đó (ví dụ: nếu dữ liệu không đại diện cho dữ liệu hợp lệ để mã hóa).

Bạn nên thử mã hóa khác để kiểm tra xem nó có giải quyết được vấn đề của bạn không

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

Tôi đã sử dụng các số trong lldb. Nếu không thì nó đã không hoạt động. Cảm ơn.
Okhan Okbay

1
Lưu ý: Nếu bạn không chắc chắn về loại mã hóa của bạn hoặc nếu nó không phải lúc nào cũng giống nhau, phương pháp này sẽ tốt cho bạn: stackoverflow.com/a/50691430/2057171
Albert Renshaw

94

Sử dụng mã dưới đây.

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

9
này sẽ không cung cấp cho tôi những chuỗi thích hợp
Mehul Mistri

3
nếu không, nó không phải là NSASCIIStringEncoding. xem câu trả lời của felipes cho các mã hóa khác
vikingosegundo

Đối với mã hóa này NSUTF8StringEncoding đưa ra con số không
Shauket Sheikh

15

-[NSString initWithData:encoding]sẽ trả về nilnếu mã hóa được chỉ định không khớp với mã hóa của dữ liệu.

Đảm bảo dữ liệu của bạn được mã hóa theo UTF-8 (hoặc thay đổi NSUTF8StringEncoding thành bất kỳ mã hóa nào phù hợp với dữ liệu).


Tôi đã chuyển đổi một hình ảnh thành NSdata và một lần nữa chuyển đổi NSdata thành Chuỗi bằng cách sử dụng NSUTF8StringEncoding. Nhưng nó đang hiển thị con số không.
Ramakrishna

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

1
Đây không phải làm việc như mô tả [[NSString alloc] initWithData: mã hóa đầu: NSUTF8StringEncoding] tác phẩm
Ryan Heitner

2

-[NSString initWithData:encoding] là bạn của bạn nhưng chỉ khi bạn sử dụng một mã hóa thích hợp.


2

Mục tiêu C:

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

Nhanh:

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

1

Nhanh:

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

hoặc .utf8hoặc bất kỳ mã hóa nào thích hợp


1

Không chắc chắn về loại mã hóa của dữ liệu? Không vấn đề gì!

Không cần biết các loại mã hóa tiềm năng, trong đó các loại mã hóa sai sẽ cho bạn nil / null, điều này sẽ bao gồm tất cả các cơ sở của bạn:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

Làm xong!




Lưu ý: Trong trường hợp cách nào đó không thành công, bạn có thể giải nén NSData của mình bằng NSKeyedUnarchiver , sau đó đóng gói (id)unpackedlại thông qua NSKeyedArchivervà biểu mẫu NSData đó phải được mã hóa base64.

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

0

trong mục tiêu C:

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

điều này là sai, nó sẽ trả về một cái gì đó giống như {length = XX, bytes = 0xYYYYYYYY}và tôi giả sử câu hỏi là làm thế nào để mở chuỗi được mã hóa khỏi các byte thô, không phải mô tả của chúng
raistlin

0

Objective C bao gồm một cách tích hợp để phát hiện mã hóa của một chuỗi được nhúng trong NSData.

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.