Skip to content

Instantly share code, notes, and snippets.

@0xced
Created February 24, 2012 15:03
Show Gist options
  • Save 0xced/1901480 to your computer and use it in GitHub Desktop.
Save 0xced/1901480 to your computer and use it in GitHub Desktop.

Revisions

  1. 0xced created this gist Feb 24, 2012.
    13 changes: 13 additions & 0 deletions NSData+Base64.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    //
    // Created by Cédric Luthi on 2012-02-24.
    // Copyright (c) 2012 Cédric Luthi. All rights reserved.
    //

    #import <Foundation/Foundation.h>

    @interface NSData (Base64)

    + (id) dataWithBase64Encoding_xcd:(NSString *)base64String;
    - (NSString *) base64Encoding_xcd;

    @end
    46 changes: 46 additions & 0 deletions NSData+Base64.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    //
    // Created by Cédric Luthi on 2012-02-24.
    // Copyright (c) 2012 Cédric Luthi. All rights reserved.
    //

    #import "NSData+Base64.h"

    #ifndef __has_feature
    #define __has_feature(x) 0
    #endif

    @implementation NSData (Base64)

    + (id) dataWithBase64Encoding_xcd:(NSString *)base64Encoding
    {
    if ([base64Encoding length] % 4 != 0)
    return nil;

    NSString *plist = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><plist version=\"1.0\"><data>%@</data></plist>", base64Encoding];
    return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL];
    }

    - (NSString *) base64Encoding_xcd
    {
    NSData *plist = [NSPropertyListSerialization dataWithPropertyList:self format:NSPropertyListXMLFormat_v1_0 options:0 error:NULL];
    NSRange fullRange = NSMakeRange(0, [plist length]);
    NSRange startRange = [plist rangeOfData:[@"<data>" dataUsingEncoding:NSASCIIStringEncoding] options:0 range:fullRange];
    NSRange endRange = [plist rangeOfData:[@"</data>" dataUsingEncoding:NSASCIIStringEncoding] options:NSDataSearchBackwards range:fullRange];
    if (startRange.location == NSNotFound || endRange.location == NSNotFound)
    return nil;

    NSUInteger base64Location = startRange.location + startRange.length;
    NSUInteger base64length = endRange.location - base64Location;
    NSData *base64Data = [NSData dataWithBytesNoCopy:(void *)((uintptr_t)base64Location + (uintptr_t)[plist bytes]) length:base64length freeWhenDone:NO];
    NSString *base64Encoding = [[NSString alloc] initWithData:base64Data encoding:NSASCIIStringEncoding];
    base64Encoding = [base64Encoding stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    base64Encoding = [base64Encoding stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    #if __has_feature(objc_arc)
    return base64Encoding;
    #else
    return [base64Encoding autorelease];
    #endif
    }

    @end