Skip to content

Instantly share code, notes, and snippets.

@libc
Created July 27, 2011 10:07
Show Gist options
  • Save libc/1109061 to your computer and use it in GitHub Desktop.
Save libc/1109061 to your computer and use it in GitHub Desktop.
#import <Foundation/Foundation.h>
//
// NSData+SLBase64.m
// Soocial for the Mac
//
// Created by alexandros@soocial.com on 3/6/11.
// Copyright 2011 Soocial BV. All rights reserved.
//
@implementation NSData (SLBase64)
static char encodingTable[64] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
+ (NSData *) dataWithBase64EncodedString:(NSString *) string {
return [[[NSData allocWithZone:nil] initWithBase64EncodedString:string] autorelease];
}
- (id) initWithBase64EncodedString:(NSString *) string {
NSMutableData *mutableData = nil;
if( string ) {
unsigned long ixtext = 0;
unsigned long lentext = 0;
unsigned char ch = 0;
unsigned char inbuf[4], outbuf[3];
short i = 0, ixinbuf = 0;
BOOL flignore = NO;
BOOL flendtext = NO;
NSData *base64Data = nil;
const unsigned char *base64Bytes = nil;
// Convert the string to ASCII data.
base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];
base64Bytes = [base64Data bytes];
mutableData = [NSMutableData dataWithCapacity:[base64Data length]];
lentext = [base64Data length];
while( YES ) {
if( ixtext >= lentext ) break;
ch = base64Bytes[ixtext++];
flignore = NO;
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 = YES;
else if( ch == '/' ) ch = 63;
else flignore = YES;
if( ! flignore ) {
short ctcharsinbuf = 3;
BOOL flbreak = NO;
if( flendtext ) {
if( ! ixinbuf ) break;
if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
else ctcharsinbuf = 2;
ixinbuf = 3;
flbreak = YES;
}
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++ )
[mutableData appendBytes:&outbuf[i] length:1];
}
if( flbreak ) break;
}
}
}
self = [self initWithData:mutableData];
return self;
}
#pragma mark -
- (NSString *) base64Encoding {
return [self base64EncodingWithLineLength:0];
}
- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength {
const unsigned char *bytes = [self bytes];
NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];
unsigned long ixtext = 0;
unsigned long lentext = [self length];
long ctremaining = 0;
unsigned char inbuf[3], outbuf[4];
unsigned short i = 0;
unsigned short charsonline = 0, ctcopy = 0;
unsigned long ix = 0;
while( YES ) {
ctremaining = lentext - ixtext;
if( ctremaining <= 0 ) break;
for( i = 0; i < 3; i++ ) {
ix = ixtext + i;
if( ix < lentext ) inbuf[i] = bytes[ix];
else inbuf [i] = 0;
}
outbuf [0] = (inbuf [0] & 0xFC) >> 2;
outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
outbuf [3] = inbuf [2] & 0x3F;
ctcopy = 4;
switch( ctremaining ) {
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}
for( i = 0; i < ctcopy; i++ )
[result appendFormat:@"%c", encodingTable[outbuf[i]]];
for( i = ctcopy; i < 4; i++ )
[result appendString:@"="];
ixtext += 3;
charsonline += 4;
if( lineLength > 0 ) {
if( charsonline >= lineLength ) {
charsonline = 0;
[result appendString:@"\n"];
}
}
}
return [NSString stringWithString:result];
}
@end
int main() {
NSString *s = @"/9j/4AAQSkZJRgABAQAAAQABAAD/4QBARXhpZgAATU0AKgAAAAgAAYdpAA \
QAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAYKADAAQAAAABAAAAYAAAAAD/2wBDAAEBAQEBAQEBA\
QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/\
2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE\
BAQEBAQEBAQEBAQH/wAARCABgAGADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAw\
QFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kxw\
RVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1\
dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19j\
Z2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8\
QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRC\
hYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE\
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5eb\
n6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+AJgd31PHPf8Apya66n8aHq/zHJcunRL8P6ufvj\
8N/C+l+Jvgv8PNA1TnTdS+HXgnnP8AyDtS+w6f/Z9/jA/4mVnqn1+p5rsxbth0/JP/ANKOd4v3l\
G+svd++6109PPXzPoH4L+Ade+NPjAafqmms3g3wR9j0/wBf+Eg8Yf8AMPOf+nPJ/PnOa/LeJsfF\
wkr73Xn1/U/RuEMpnGtCbT1ad+/M2/Lq2f0J/Af9nPS/DPh/TtS1TTv+Jnnr20/TuST+H/QXzz6\
Yr8kqV+epKzum3+N/zv1t3P6NyyKp0Ip9tH9/39fmz7+8E/CfS2/s/b+vp/h60fUZPW293v8A4n\
38l9/mejUx0Umr3t36vXro3suu77n0ZpvwdbK5yeef+P4f/X61ccDZpvu+vrbr8zzauOWuve/46\
eu1+vmbEfw499P49vX8+evqK2lT07/h+p5rxS5r72b1t3vfddXbe99d2eV+M/hHn/mG/wCT26f5\
HrWEqbT7vr/V+p6OFxatdPfv53/G9+789z4F+NHwT+22Go6fqmm/8S3Of55//Xnvk1wTXsppvv8\
Am99Nev8AwbanqU6P1ynJLXRr77/l95/Pb+0T8OtU+C/jD/hMdLz/AMIbqf8AxL/GthkfYLAY/s\
fT/Een9f8AiZWd1z/149j9jr9Z4Tz+GHhGm5K8lbXd835/hfq3ufifHPDc5VKk4xdldvslq39nX\
prt53PnP41/N8GPiso+XTX+HXjb/iZn/sXNRye3fB/zur9KwlZT1v8AFr3ve79d3/wT8PxtBxm0\
r6O2ur0uvzv3fc/nJmPzqc+ufxPP861r+831vf5vT9SVFxS+evzImYlifQnt0z1/P3rap/Gh6v8\
AMHre+tz+h34Mx/8AFl/h3/0EP+FdeCf/AEh0/J5755611Y1/7K9fsP8ABSuRTwLqVqdouXvx21\
vrr1fdf1Y/ar9j/wCE+l+F/A2m/N/xMtS1X/hJNS6/8hL1+vfvjvnmvwPP6rm6nvdZXXmm+19vw\
+Z/RPD2ChThSfK9IQ/K/W+/T5+Z+4Xw30bnT/f8z9eP8e1fF0qTlUd3fW7+V+t/Tz7rv946/s42\
20suv6b+a1XofUHhvQst/n1/5h//ABNO/JP1HeveU7K1vx/4ByzqXUmpL7/v9eu//Afr1n/ohPP\
9e+f6/wD1+MVfPHv+DPOqVJN9fTfr+ur7nSWsel/9A3/PPofw/wAiplCLvr3vq3f8fJ/j5nPLmb\
Vn3u9/TfU4DW30tv7Rz/nr0/H+v1GEqa2279f1PSwl7O772bv/AHtden/BPlzxxZ6bfH+z9U/5i\
P8A+o/4/UnmvLxVJPo9L/1ffR+fTyPosJinh1d+t1ffe9+/Vvr5n48/tofBvQb7wf4i/wCJZjT9\
SJx1/wCYh9TxqX/LpnrmtsBKdOpCzbfPG2rT+LXr/XzPFzuccZCs3Fawm1/4DLzf521+Z/NzrWo\
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\
XxO8VasPgvqXP/MKvdzkHufUnv7+2fbWOIU0lfR+Xb5eXc4aWBfM35vd+bSvr1WtzxmHVdU8S/D\
fwX/Zrahpen/8ACGf2hpXiHSvsOsWH9vfYf+hfGqWX9pH+38/8Ta8FdEaXPZ9vw173d9vP5lVcK\
4qVl3t9710b1frZ331Pz70v4gftufD3UfiMfFHi7w/qmm+G9N/tDw14Q1Xw3Y/8Vhpvrp+oeHMa\
Tp2pf2X/AM/n20468161CKoayb/P179XfX/M8z6pzX82+vr597dO+h4T4z1zU/2kNP034gappv8\
AYP8AZuleKtQ1Kw/5f/8AhJP+QP8AYf8AsHf8S/8A5c+v8++GPs4q9/eT+5y8tVpHXXz1Pn8zyx\
vmaXSXzun1/q5/Nx+2b+zppSeF/Gnxy0rxIdUHgnVvFXw78S+D/wCzcHQP+EgsNQ1jQL7+0f7Tb\
+0f+vTnFjg+or9Iy/MozUE7fDHX9euul/5k9dL6/jWc5G6KnU21b1enxO76Wa9T8M8kk569cnB9\
cc9fX+pr2akvaq6Xnpfvru/z6/j8dyuEn318+93u9+voSx/eT/eP9KqlTjOlO/3d9/x+aOjDJQx\
MXruvPt6dz+r74G+NLrxR+zv+zRt1LUM6b8MvBPhv+wsf8x7w/wD8SfUL3/wQ/wBnnJ56/j8hi8\
Ko1KjatpJu/wDhlvr31Wt9j9dy2t+4pWd9Y9d9fz89dup+9X7INx9u0/8As/b/AMg3Vfzzn35z/\
npmvy7MaN3Ny096X5v9b316+Z+o4Ktzxgr/AGV27N9rn6p+GvCel2P/ABMDpv8AwHjPp3Pc56ev\
SvJhFwejsv673dtX1udNeg5+8ovutP1t179zprrRdLvP+Jhq2mtpenab+fr169z+Xqa6pVX3vff\
p+gUaVVO/NbzdtN9W2++u/mfNXxW1hrHxBp7Nzz/Z+m8/8g/oe/1/xxzWD1vfW57FKNRpe/prfW\
PW/n1Mf4mSap/wpfUuv/IK/wAfQ/8A1/SpVBwlez18vXzdtzrjJJPv+f8AX9XKP7Ocml+KfB/9n\
6ov3D/wknhs/wDYX/5CH/YN+v8AjW8a7g0n6NNbpv0/U87FVn09Ov3/AJb63PYPGPhfS9a8H6j4\
f0vVPEGmf8Sr+z/+Jlpv+n+/+euK6MVinyqzvo1dfO/V/jexyUal200035Pz8v1Pzr8ReH/+FZe\
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";
NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
[NSData dataWithBase64EncodedString:s];
[subPool drain];
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment