Friday, November 5, 2010

How to do base64 encoding using Objective C

I am including in this post a code snippet that can be used to do base64 encoding.

#import "Base64Encoder.h"

#define ArrayLength(x) (sizeof(x)/sizeof(*(x)))

@implementation Base64Encoder

static char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static char decodingTable[128];

+ (void) initialize {

if (self == [Base64Encoder class]) {

memset(decodingTable, 0, ArrayLength(decodingTable));

for (NSInteger i = 0; i < ArrayLength(encodingTable); i++) {

decodingTable[encodingTable[i]] = i;

}

}

}

+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length {

NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];

uint8_t* output = (uint8_t*)data.mutableBytes;

for (NSInteger i = 0; i < class="s4">3) {

NSInteger value = 0;

for (NSInteger j = i; j < (i + 3); j++) {

value <<= 8;

if (j <>

value |= (0xFF & input[j]);

}

}

NSInteger index = (i / 3) * 4;

output[index + 0] = encodingTable[(value >> 18) & 0x3F];

output[index + 1] = encodingTable[(value >> 12) & 0x3F];

output[index + 2] = (i + 1) < class="s5">encodingTable[(value >> 6) & 0x3F] : '=';

output[index + 3] = (i + 2) < class="s5">encodingTable[(value >> 0) & 0x3F] : '=';

}

return [[[NSString alloc] initWithData:data

encoding:NSASCIIStringEncoding] autorelease];

}

+ (NSString*) encode:(NSData*) rawBytes {

return [self encode:(const uint8_t*) rawBytes.bytes length:rawBytes.length];

}

+ (NSData*) decode:(const char*) string length:(NSInteger) inputLength {

if ((string == NULL) || (inputLength % 4 != 0)) {

return nil;

}

while (inputLength > 0 && string[inputLength - 1] == '=') {

inputLength--;

}

NSInteger outputLength = inputLength * 3 / 4;

NSMutableData* data = [NSMutableData dataWithLength:outputLength];

uint8_t* output = data.mutableBytes;

NSInteger inputPoint = 0;

NSInteger outputPoint = 0;

while (inputPoint <>

char i0 = string[inputPoint++];

char i1 = string[inputPoint++];

char i2 = inputPoint < class="s4">'A'; /* 'A' will decode to \0 */

char i3 = inputPoint < class="s4">'A';

output[outputPoint++] = (decodingTable[i0] << 2) | (decodingTable[i1] >> 4);

if (outputPoint <>

output[outputPoint++] = ((decodingTable[i1] & 0xf) << 4) | (decodingTable[i2] >> 2);

}

if (outputPoint <>

output[outputPoint++] = ((decodingTable[i2] & 0x3) << 6) | decodingTable[i3];

}

}

return data;

}

+ (NSData*) decode:(NSString*) string {

return [self decode:[string cStringUsingEncoding:NSASCIIStringEncoding] length:string.length];

}

@end

No comments: