Giải mã Base64 trong iOS 7+


184

Tôi đã mã hóa văn bản ( NSString) bằng NSDataAPI mới Class được thêm vào iOS7.

Sử dụng cái này

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;  

đây là mã của tôi

NSString *base64EncodedString = [[myText dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];

NSLog(@"%@", base64EncodedString);

Tôi đang tìm cách giải mã nó


7
m_EncodeText: làm ơn dừng lại
Carl Veazey

1
bạn đã tìm thấy ở base64EncodedStringWithOptions:đâu
dùng2159978

@ user2159978 nó ở đó trong tài liệu táo developer.apple.com/library/ios/documentation/cocoa/reference/...
Sandeep Khade

Có vẻ như nó xảy ra khi tôi sử dụng mục tiêu ứng dụng mac os console. Hoặc phiên bản cũ của mục tiêu os sdk / mac
user2159978

Câu trả lời:


438

Swift 3+

let plainString = "foo"

Mã hóa

let plainData = plainString.data(using: .utf8)
let base64String = plainData?.base64EncodedString()
print(base64String!) // Zm9v

Giải mã

if let decodedData = Data(base64Encoded: base64String!),
   let decodedString = String(data: decodedData, encoding: .utf8) {
  print(decodedString) // foo
}

Swift <3

let plainString = "foo"

Mã hóa

let plainData = plainString.dataUsingEncoding(NSUTF8StringEncoding)
let base64String = plainData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
print(base64String!) // Zm9v

Giải mã

let decodedData = NSData(base64EncodedString: base64String!, options: NSDataBase64DecodingOptions(rawValue: 0))
let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding)
print(decodedString) // foo

Mục tiêu-C

NSString *plainString = @"foo";

Mã hóa

NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [plainData base64EncodedStringWithOptions:0];
NSLog(@"%@", base64String); // Zm9v

Giải mã

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", decodedString); // foo 


1
Tôi không nghĩ mã này là sạch. Tôi nhận được cảnh báo: "các loại con trỏ không tương thích khởi tạo NNSTring với biểu thức của NSData"
drlobo

9
@drlobo bạn phải gõ base64EncodingDataWithOptions: thay vì base64EncodingStringWithOptions:
Bach

4
Cảm ơn vì điều đó. Một cái gì đó tôi vừa tìm thấy: một hằng số kNilOptionsbằng 0, có thể dễ đọc hơn là sử dụng 0 cho các tùy chọn.
Adam Chờ đợi

2
@AdamWaite kNilOptionsđược định nghĩa trong MacTypes.hđó là một tiêu đề OSX cũ, vì vậy tôi không thích sử dụng nó, vì tôi nghĩ rằng tiêu đề đó nên được loại bỏ hoàn toàn khỏi SDK iOS. Dù sao, bạn có một điểm để nói rằng rất dễ đọc, vì vậy hãy thoải mái sử dụng nó.
Gabriele Petronella

2
nếu bất cứ ai nhận được thử không, NSDataBase64DecodingOptions.IgnoreUnknownCharacterstôi đã gặp vấn đề này
spaceMonkey

81

Trong trường hợp bạn muốn viết mã dự phòng, việc giải mã từ base64 đã có mặt trong iOS kể từ khi bắt đầu bằng cách báo trước NSURL:

NSURL *URL = [NSURL URLWithString:
      [NSString stringWithFormat:@"data:application/octet-stream;base64,%@",
           base64String]];

return [NSData dataWithContentsOfURL:URL];

12
Tôi hoàn toàn ấn tượng với câu trả lời này. Trong nhiều năm, tôi đã sử dụng một số lượng mã vô lý để giải mã một chuỗi và tất cả cùng có một giải pháp 2 dòng.
AlBeebe

Điều này thật tuyệt! Hacky, nhưng tuyệt vời :)
Micha Mazaheri

Tôi chưa bao giờ nghĩ là dễ dàng như vậy! Cảm ơn!!
Kumar C
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.