Created
February 5, 2010 20:14
-
-
Save sbrocket/296174 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| - (id) initWithBase64EncodedString:(NSString *) string { | |
| NSMutableData *mutableData = nil; | |
| if( string ) { | |
| unsigned long ixtext = 0; | |
| unsigned long lentext = 0; | |
| unsigned char ch = 0; | |
| unsigned char inbuf[3], outbuf[4]; | |
| short i = 0, ixinbuf = 0; | |
| BOOL flignore = NO; | |
| BOOL flendtext = NO; | |
| NSData *base64Data = nil; | |
| const unsigned char *base64Bytes = nil; | |
| // Convert the string to ASCII data. | |
| base64Data = [string dataUsingEncoding:NSASCIIStringEncoding]; | |
| base64Bytes = [base64Data bytes]; | |
| mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; | |
| lentext = [base64Data length]; | |
| while( YES ) { | |
| if( ixtext >= lentext ) break; | |
| ch = base64Bytes[ixtext++]; | |
| flignore = NO; | |
| if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A'; | |
| else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26; | |
| else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52; | |
| else if( ch == '+' ) ch = 62; | |
| else if( ch == '=' ) flendtext = YES; | |
| else if( ch == '/' ) ch = 63; | |
| else flignore = YES; | |
| if( ! flignore ) { | |
| short ctcharsinbuf = 3; | |
| BOOL flbreak = NO; | |
| if( flendtext ) { | |
| if( ! ixinbuf ) break; | |
| if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1; | |
| else ctcharsinbuf = 2; | |
| ixinbuf = 3; | |
| flbreak = YES; | |
| } | |
| inbuf [ixinbuf++] = ch; // !!!! Breakpoint is here !!!! | |
| if( ixinbuf == 4 ) { | |
| ixinbuf = 0; | |
| outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 ); | |
| outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 ); | |
| outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F ); | |
| for( i = 0; i < ctcharsinbuf; i++ ) | |
| [mutableData appendBytes:&outbuf[i] length:1]; | |
| } | |
| if( flbreak ) break; | |
| } | |
| } | |
| } | |
| self = [self initWithData:mutableData]; | |
| return self; | |
| } | |
| Sample GDB output: | |
| (gdb) po mutableData | |
| <> | |
| (gdb) continue | |
| (gdb) po mutableData | |
| <> | |
| (gdb) continue | |
| (gdb) po mutableData | |
| <> | |
| (gdb) continue | |
| (gdb) po mutableData | |
| <> | |
| (gdb) step | |
| (gdb) po mutableData | |
| Program received signal EXC_BAD_ACCESS, Could not access memory. | |
| Reason: KERN_PROTECTION_FAILURE at address: 0x00000000 | |
| 0x323fe6f6 in objc_msgSend () | |
| The program being debugged was signaled while in a function called from GDB. | |
| GDB has restored the context to what it was before the call. | |
| To change this behavior use "set unwindonsignal off" | |
| Evaluation of the expression containing the function (_NSPrintForDebugger) will be abandoned. | |
| (gdb) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment