How to Base64 encoding on the iPhone

前端 未结 9 2118
情话喂你
情话喂你 2020-11-29 03:13

How do I do Base64 encoding on the iPhone?

I have found a few examples that looked promising, but could never get any of them to work on the phone.

9条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-29 03:56

    A method in a NSData category

    - (NSString*)encodeBase64 {    
        static char* alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
        unsigned int length = self.length;
        unsigned const char* rawData = self.bytes;
    
        //empty data = empty output
        if (length == 0) {
            return @"";
        }
    
        unsigned int outputLength = (((length + 2) / 3) * 4);
    
        //let's allocate buffer for the output
        char* rawOutput = malloc(outputLength + 1);
    
        //with each step we get 3 bytes from the input and write 4 bytes to the output
        for (unsigned int i = 0, outputIndex = 0; i < length; i += 3, outputIndex += 4) {
            BOOL triple = NO;
            BOOL quad = NO;
    
            //get 3 bytes (or only 1 or 2 when we have reached the end of input)
            unsigned int value = rawData[i];
            value <<= 8;
    
            if (i + 1 < length) {
                value |= rawData[i + 1];
                triple = YES;
            }
    
            value <<= 8;
    
            if (i + 2 < length) {
                value |= rawData[i + 2];
                quad = YES;
            }
    
            //3 * 8 bits written as 4 * 6 bits (indexing the 64 chars of the alphabet)
            //write = if end of input reached
            rawOutput[outputIndex + 3] = (quad) ? alphabet[value & 0x3F] : '=';
            value >>= 6;
            rawOutput[outputIndex + 2] = (triple) ? alphabet[value & 0x3F] : '=';
            value >>= 6;
            rawOutput[outputIndex + 1] = alphabet[value & 0x3F];
            value >>= 6;
            rawOutput[outputIndex] = alphabet[value & 0x3F];
        }
    
        rawOutput[outputLength] = 0;
    
        NSString* output = [NSString stringWithCString:rawOutput encoding:NSASCIIStringEncoding];
    
        free(rawOutput);
    
        return output;
    }
    

提交回复
热议问题