การถอดรหัส Base64 ใน iOS 7+


184

ฉันมีข้อความที่เข้ารหัส ( NSString) โดยใช้NSDataClass new API ซึ่งเพิ่มใน iOS7

ใช้สิ่งนี้

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

นี่คือรหัสของฉัน

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

NSLog(@"%@", base64EncodedString);

ฉันกำลังมองหาที่จะถอดรหัส


7
m_EncodeText: โปรดหยุด
Carl Veazey

1
คุณพบbase64EncodedStringWithOptions:ที่ไหน
user2159978

@ user2159978 มีอยู่ใน apple docs developer.apple.com/library/ios/documentation/cocoa/reference/…
Sandeep Khade

ดูเหมือนว่าจะเกิดขึ้นเมื่อฉันใช้เป้าหมายแอปพลิเคชันคอนโซลของ mac os หรือเป้าหมาย sdk / mac os เวอร์ชันเก่า
user2159978

คำตอบ:


438

Swift 3+

let plainString = "foo"

การเข้ารหัส

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

ถอดรหัส

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

สวิฟต์ <3

let plainString = "foo"

การเข้ารหัส

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

ถอดรหัส

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

Objective-C

NSString *plainString = @"foo";

การเข้ารหัส

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

ถอดรหัส

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


1
ฉันไม่คิดว่ารหัสนี้สะอาด ฉันได้รับการแจ้งเตือน: "ประเภทตัวชี้เข้ากันไม่ได้เริ่มต้น NNSTring กับการแสดงออกของ NSData เป็น"
drlobo

9
@drlobo คุณต้องพิมพ์ base64EncodedDataWithOptions: แทนที่จะเป็น base64EncodedStringWithOptions:
Bach

4
ขอบคุณสำหรับสิ่งนี้. สิ่งที่ฉันเพิ่งค้นพบ: ค่าคงที่kNilOptionsเท่ากับ 0 ซึ่งสามารถอ่านได้ง่ายกว่าการใช้ 0 สำหรับตัวเลือก
Adam Waite

2
@ AdamWaite kNilOptionsมีการกำหนดไว้MacTypes.hซึ่งเป็นส่วนหัว OSX แบบดั้งเดิมดังนั้นฉันไม่ชอบใช้มันเนื่องจากฉันคิดว่าส่วนหัวนั้นควรถูกลบออกจาก iOS SDK โดยสิ้นเชิง อย่างไรก็ตามคุณมีจุดที่จะบอกว่าสามารถอ่านได้มากดังนั้นอย่าลังเลที่จะใช้มัน
Gabriele Petronella

2
หากใครได้ลองลองNSDataBase64DecodingOptions.IgnoreUnknownCharactersฉันมีปัญหานี้
spaceMonkey

81

ในกรณีที่คุณต้องการเขียนโค้ดทางเลือกการถอดรหัสจาก base64 นั้นมีอยู่ใน iOS ตั้งแต่เริ่มต้นโดยข้อสังเกตของNSURL:

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

return [NSData dataWithContentsOfURL:URL];

12
ฉันประทับใจอย่างยิ่งกับคำตอบนี้ เป็นเวลาหลายปีมาแล้วที่ฉันใช้โค้ดที่ไร้สาระเพื่อถอดรหัสสตริงและทั้งหมดนี้ก็มีโซลูชัน 2 บรรทัด
AlBeebe

นี่มันเจ๋งมาก! แฮ็ก แต่ยอดเยี่ยม :)
Micha Mazaheri

ฉันไม่เคยคิดว่าจะเป็นเรื่องง่ายเลย! ขอบคุณ !!
Kumar C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.