// Copyright (c) 2006 Dave Dribin (http://www.dribin.org/dave/) // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #import "NSData-Base64Extensions.h" #include #include @implementation NSData (Base64) - (NSString *) encodeBase64 { //Point to start of the data and set buffer sizes int inLength = (int)[self length]; int outLength = ((((inLength * 4)/3)/4)*4) + (((inLength * 4)/3)%4 ? 4 : 0); const char *inputBuffer = [self bytes]; char *outputBuffer = malloc(outLength+1); outputBuffer[outLength] = 0; //64 digit code static char Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //start the count int cycle = 0; int inpos = 0; int outpos = 0; char temp; //Pad the last to bytes, the outbuffer must always be a multiple of 4 outputBuffer[outLength-1] = '='; outputBuffer[outLength-2] = '='; /* http://en.wikipedia.org/wiki/Base64 Text content M a n ASCII 77 97 110 8 Bit pattern 01001101 01100001 01101110 6 Bit pattern 010011 010110 000101 101110 Index 19 22 5 46 Base64-encoded T W F u */ while (inpos < inLength){ switch (cycle) { case 0: outputBuffer[outpos++] = Encode[(inputBuffer[inpos]&0xFC)>>2]; cycle = 1; break; case 1: temp = (inputBuffer[inpos++]&0x03)<<4; outputBuffer[outpos] = Encode[temp]; cycle = 2; break; case 2: outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xF0)>> 4]; temp = (inputBuffer[inpos++]&0x0F)<<2; outputBuffer[outpos] = Encode[temp]; cycle = 3; break; case 3: outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xC0)>>6]; cycle = 4; break; case 4: outputBuffer[outpos++] = Encode[inputBuffer[inpos++]&0x3f]; cycle = 0; break; default: cycle = 0; break; } } NSString *pictemp = [NSString stringWithUTF8String:outputBuffer]; free(outputBuffer); return pictemp; } @end