NSData+Base64

来源:互联网 发布:dw淘宝代码使用教程 编辑:程序博客网 时间:2024/06/06 10:07

NSData+Base64.h


#import <Foundation/Foundation.h>

@interface NSData (Base64)


+ (NSData *)dataWithBase64EncodedString:(NSString *)string;

- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;

- (NSString *)base64EncodedString;

@end


NSData+Base64.m

#import "NSData+Base64.h"


@implementation NSData (Base64)


+ (NSData *)dataWithBase64EncodedString:(NSString *)string

{

   const char lookup[] =

    {

       9999999999,9999999999,9999999999,99,

       9999999999,9999999999,9999999999,99,

       9999999999,9999999999,9962999999,63,

       5253545556,5758596061,9999999999,99,

       99,  0,  1,  2,  34,  5,  6,  7,  8910111213,14,

       1516171819,2021222324,2599999999,99,

       9926272829,3031323334,3536373839,40,

       4142434445,4647484950,5199999999,99

    };

    

    NSData *inputData = [stringdataUsingEncoding:NSASCIIStringEncodingallowLossyConversion:YES];

   long long inputLength = [inputDatalength];

   const unsignedchar *inputBytes = [inputData bytes];

    

   long long maxOutputLength = (inputLength /4 + 1) * 3;

   NSMutableData *outputData = [NSMutableDatadataWithLength:maxOutputLength];

   unsigned char *outputBytes = (unsignedchar *)[outputData mutableBytes];

    

   int accumulator = 0;

   long long outputLength =0;

   unsigned char accumulated[] = {0,000};

   for (long long i = 0; i < inputLength; i++)

    {

       unsigned char decoded = lookup[inputBytes[i] &0x7F];

       if (decoded != 99)

        {

            accumulated[accumulator] = decoded;

           if (accumulator == 3)

            {

                outputBytes[outputLength++] = (accumulated[0] <<2) | (accumulated[1] >>4);

                outputBytes[outputLength++] = (accumulated[1] <<4) | (accumulated[2] >>2);

                outputBytes[outputLength++] = (accumulated[2] <<6) | accumulated[3];

            }

            accumulator = (accumulator +1) % 4;

        }

    }

    

    //handle left-over data

   if (accumulator > 0) outputBytes[outputLength] = (accumulated[0] <<2) | (accumulated[1] >>4);

   if (accumulator > 1) outputBytes[++outputLength] = (accumulated[1] <<4) | (accumulated[2] >>2);

   if (accumulator > 2) outputLength++;

    

    //truncate data to match actual output length

    outputData.length = outputLength;

   return outputLength? outputData: nil;

}


- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth

{

    //ensure wrapWidth is a multiple of 4

    wrapWidth = (wrapWidth /4) * 4;

    

    constchar lookup[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    

   long long inputLength = [selflength];

   const unsignedchar *inputBytes = [selfbytes];

    

   long long maxOutputLength = (inputLength /3 + 1) * 4;

    maxOutputLength += wrapWidth? (maxOutputLength / wrapWidth) *20;

   unsigned char *outputBytes = (unsignedchar *)malloc(maxOutputLength);

    

   long long i;

   long long outputLength =0;

   for (i = 0; i < inputLength -2; i += 3)

    {

        outputBytes[outputLength++] = lookup[(inputBytes[i] &0xFC) >> 2];

        outputBytes[outputLength++] = lookup[((inputBytes[i] &0x03) << 4) | ((inputBytes[i +1] & 0xF0) >>4)];

        outputBytes[outputLength++] = lookup[((inputBytes[i +1] & 0x0F) <<2) | ((inputBytes[i + 2] & 0xC0) >> 6)];

        outputBytes[outputLength++] = lookup[inputBytes[i +2] & 0x3F];

        

        //add line break

       if (wrapWidth && (outputLength + 2) % (wrapWidth + 2) == 0)

        {

            outputBytes[outputLength++] ='\r';

            outputBytes[outputLength++] ='\n';

        }

    }

    

    //handle left-over data

   if (i == inputLength - 2)

    {

        // = terminator

        outputBytes[outputLength++] = lookup[(inputBytes[i] &0xFC) >> 2];

        outputBytes[outputLength++] = lookup[((inputBytes[i] &0x03) << 4) | ((inputBytes[i +1] & 0xF0) >>4)];

        outputBytes[outputLength++] = lookup[(inputBytes[i +1] & 0x0F) <<2];

        outputBytes[outputLength++] =  '=';

    }

   else if (i == inputLength -1)

    {

        // == terminator

        outputBytes[outputLength++] = lookup[(inputBytes[i] &0xFC) >> 2];

        outputBytes[outputLength++] = lookup[(inputBytes[i] &0x03) << 4];

        outputBytes[outputLength++] ='=';

        outputBytes[outputLength++] ='=';

    }

    

    //truncate data to match actual output length

    outputBytes =realloc(outputBytes, outputLength);

    NSString *result = [[NSStringallocinitWithBytesNoCopy:outputByteslength:outputLengthencoding:NSASCIIStringEncodingfreeWhenDone:YES];

    

#if !__has_feature(objc_arc)

    [resultautorelease];

#endif

    

   return (outputLength >= 4)? result: nil;

}


- (NSString *)base64EncodedString

{

    return [selfbase64EncodedStringWithWrapWidth:0];

}


@end



NSString+Base64.h

#import <Foundation/Foundation.h>


@interface NSString (Base64)


+ (NSString *)stringWithBase64EncodedString:(NSString *)string;

- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;

- (NSString *)base64EncodedString;

- (NSString *)base64DecodedString;

- (NSData *)base64DecodedData;


@end


NSstring+Base64.m

#import "NSString+Base64.h"

#import "NSData+Base64.h"


@implementation NSString (Base64)


+ (NSString *)stringWithBase64EncodedString:(NSString *)string

{

    NSData *data = [NSDatadataWithBase64EncodedString:string];

   if (data)

    {

        NSString *result = [[selfallocinitWithData:dataencoding:NSUTF8StringEncoding];

        

#if !__has_feature(objc_arc)

        [resultautorelease];

#endif

        

       return result;

    }

    return nil;

}


- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth

{

    NSData *data = [selfdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];

    return [database64EncodedStringWithWrapWidth:wrapWidth];

}


- (NSString *)base64EncodedString

{

    NSData *data = [selfdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];

    return [database64EncodedString];

}


- (NSString *)base64DecodedString

{

    return [NSStringstringWithBase64EncodedString:self];

}


- (NSData *)base64DecodedData

{

    return [NSDatadataWithBase64EncodedString:self];

}


@end


0 0
原创粉丝点击