How to Base64 encoding on the iPhone

前端 未结 9 2103
情话喂你
情话喂你 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条回答
  •  感情败类
    2020-11-29 03:55

    I did my own implementation, where has been removed all checks inside the loop. So on big amount of data, it works faster. You can take it as a basis for own solution.

    static char *alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    
    + (NSString *)encodeString:(NSString *)data
    {
        const char *input = [data cStringUsingEncoding:NSUTF8StringEncoding];
        unsigned long inputLength = [data length];
        unsigned long modulo = inputLength % 3;
        unsigned long outputLength = (inputLength / 3) * 4 + (modulo ? 4 : 0);
        unsigned long j = 0;
    
        // Do not forget about trailing zero
        unsigned char *output = malloc(outputLength + 1);
        output[outputLength] = 0;
    
        // Here are no checks inside the loop, so it works much faster than other implementations
        for (unsigned long i = 0; i < inputLength; i += 3) {
            output[j++] = alphabet[ (input[i] & 0xFC) >> 2 ];
            output[j++] = alphabet[ ((input[i] & 0x03) << 4) | ((input[i + 1] & 0xF0) >> 4) ];
            output[j++] = alphabet[ ((input[i + 1] & 0x0F)) << 2 | ((input[i + 2] & 0xC0) >> 6) ];
            output[j++] = alphabet[ (input[i + 2] & 0x3F) ];
        }
        // Padding in the end of encoded string directly depends of modulo
        if (modulo > 0) {
            output[outputLength - 1] = '=';
            if (modulo == 1)
                output[outputLength - 2] = '=';
        }
        NSString *s = [NSString stringWithUTF8String:(const char *)output];
        free(output);
        return s;
    }
    

提交回复
热议问题