Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here is a base 64 encode function for <code>NSString</code> to <code>NSString</code>:</p> <pre><code>+(NSString *) encodeString:(NSString *)inString { NSData *data = [inString dataUsingEncoding:NSUTF8StringEncoding]; //Point to start of the data and set buffer sizes int inLength = [data length]; int outLength = ((((inLength * 4)/3)/4)*4) + (((inLength * 4)/3)%4 ? 4 : 0); const char *inputBuffer = [data bytes]; char *outputBuffer = malloc(outLength); outputBuffer[outLength] = 0; //64 digit code static char Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //start the count int cycle = 0; int inpos = 0; int outpos = 0; char temp; outputBuffer[outLength-1] = '='; outputBuffer[outLength-2] = '='; while (inpos &lt; inLength){ switch (cycle) { case 0: outputBuffer[outpos++] = Encode[(inputBuffer[inpos]&amp;0xFC)&gt;&gt;2]; cycle = 1; break; case 1: temp = (inputBuffer[inpos++]&amp;0x03)&lt;&lt;4; outputBuffer[outpos] = Encode[temp]; cycle = 2; break; case 2: outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&amp;0xF0)&gt;&gt; 4]; temp = (inputBuffer[inpos++]&amp;0x0F)&lt;&lt;2; outputBuffer[outpos] = Encode[temp]; cycle = 3; break; case 3: outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&amp;0xC0)&gt;&gt;6]; cycle = 4; break; case 4: outputBuffer[outpos++] = Encode[inputBuffer[inpos++]&amp;0x3f]; cycle = 0; break; default: cycle = 0; break; } } NSString *pictemp = [NSString stringWithUTF8String:outputBuffer]; free(outputBuffer); return pictemp; } </code></pre> <p>and Here is a base 64 decode function for <code>NSString</code> to <code>NSString</code>:</p> <pre><code>+(NSString *) decodeString:(NSString *)inString { const char* string = [inString cStringUsingEncoding:NSASCIIStringEncoding]; NSInteger inputLength = inString.length; static char decodingTable[128]; static char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (NSInteger i = 0; i &lt; 128; i++) { decodingTable[encodingTable[i]] = i; } if ((string == NULL) || (inputLength % 4 != 0)) { return nil; } while (inputLength &gt; 0 &amp;&amp; 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 &lt; inputLength) { char i0 = string[inputPoint++]; char i1 = string[inputPoint++]; char i2 = inputPoint &lt; inputLength ? string[inputPoint++] : 'A'; /* 'A' will decode to \0 */ char i3 = inputPoint &lt; inputLength ? string[inputPoint++] : 'A'; output[outputPoint++] = (decodingTable[i0] &lt;&lt; 2) | (decodingTable[i1] &gt;&gt; 4); if (outputPoint &lt; outputLength) { output[outputPoint++] = ((decodingTable[i1] &amp; 0xf) &lt;&lt; 4) | (decodingTable[i2] &gt;&gt; 2); } if (outputPoint &lt; outputLength) { output[outputPoint++] = ((decodingTable[i2] &amp; 0x3) &lt;&lt; 6) | decodingTable[i3]; } } NSLog(@"%@",data); NSString *finalString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; return finalString; } </code></pre> <p>These were pieced together from examples I found in various places on the internet when I was searching for them a while ago. They, may be easier for you to implement. I just created a <code>Base64</code> class and placed these methods in it.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload