123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- //
- // NSData+Base64.h
- // Gurpartap Singh
- //
- // Created by Gurpartap Singh on 06/05/12.
- // Copyright (c) 2012 Gurpartap Singh. All rights reserved.
- //
- #import "NSData+Base64.h"
- @implementation NSData (Base64Additions)
- + (NSData *)base64DataFromString:(NSString *)string {
- unsigned long ixtext, lentext;
- unsigned char ch, inbuf[4], outbuf[3];
- short i, ixinbuf;
- Boolean flignore, flendtext = false;
- const unsigned char *tempcstring;
- NSMutableData *theData;
-
- if (string == nil) {
- return [NSData data];
- }
-
- ixtext = 0;
-
- tempcstring = (const unsigned char *)[string UTF8String];
-
- lentext = [string length];
-
- theData = [NSMutableData dataWithCapacity: lentext];
-
- ixinbuf = 0;
-
- while (true) {
- if (ixtext >= lentext) {
- break;
- }
-
- ch = tempcstring [ixtext++];
-
- flignore = false;
-
- if ((ch >= 'A') && (ch <= 'Z')) {
- ch = ch - 'A';
- }
- else if ((ch >= 'a') && (ch <= 'z')) {
- ch = ch - 'a' + 26;
- }
- else if ((ch >= '0') && (ch <= '9')) {
- ch = ch - '0' + 52;
- }
- else if (ch == '+') {
- ch = 62;
- }
- else if (ch == '=') {
- flendtext = true;
- }
- else if (ch == '/') {
- ch = 63;
- }
- else {
- flignore = true;
- }
-
- if (!flignore) {
- short ctcharsinbuf = 3;
- Boolean flbreak = false;
-
- if (flendtext) {
- if (ixinbuf == 0) {
- break;
- }
-
- if ((ixinbuf == 1) || (ixinbuf == 2)) {
- ctcharsinbuf = 1;
- }
- else {
- ctcharsinbuf = 2;
- }
-
- ixinbuf = 3;
-
- flbreak = true;
- }
-
- inbuf [ixinbuf++] = ch;
-
- if (ixinbuf == 4) {
- ixinbuf = 0;
-
- outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
- outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
- outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
-
- for (i = 0; i < ctcharsinbuf; i++) {
- [theData appendBytes: &outbuf[i] length: 1];
- }
- }
-
- if (flbreak) {
- break;
- }
- }
- }
-
- return theData;
- }
- @end
|