Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

C++, how to find a character's matching index within another character array?

Posted on 2009-05-20
4
Medium Priority
?
456 Views
Last Modified: 2012-05-07
Hi all,

I have a character array with base 64 digits "alph" and I have a character array containing a base 64 message, "cTotalImage". My algorithm below works fine, but I was thinking that there MUST be a better way to find a particular character's index within "alph". Does anyone know of a faster general approach to what I'm doing here?

Please let me know if I can clear any of this up! Thanks for your help in advance.

BTW I know there are classes out there that do this, but I'd rather write one of my own so that I can learn and grow my programming knowledge - do not suggest that I go elsewhere for a base 64 decoding class.
char alph[64];
	strcpy(alph, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
	
 
		// Find index of characters in alph
		short iSearch;
		short iDecimals[4] = {0, 0, 0, 0};
		for (iSearch = 0; iSearch < 64; iSearch++)
		{
			if (cTotalImage[iDecodeIndex] == alph[iSearch])
			{
				iDecimals[0] = iSearch;
				break;
			}
		}
		for (iSearch = 0; iSearch < 64; iSearch++)
		{
			if (cTotalImage[iDecodeIndex + 1] == alph[iSearch])
			{
				iDecimals[1] = iSearch;
				break;
			}
		}
		// etc...

Open in new window

0
Comment
Question by:ehensens
  • 2
4 Comments
 
LVL 85

Expert Comment

by:ozo
ID: 24436008
// if you are going to do it many times, initialize
int index[CHAR_MAX+1];

for( int i;i<64;i++){
   index[alpha[i] = i;
}

then

for( i=0;i<4; i++ ){
  decimals[i] = index[cTotalImage[iDecodeIndex+i]];
}
0
 

Author Comment

by:ehensens
ID: 24436061
Hi ozo,

Thank you for your reponse. I cannot quite understand what you're doing (sorry), could you please add comments and fix the index[alpha[i] = i; part? Thanks!
0
 
LVL 86

Accepted Solution

by:
jkr earned 2000 total points
ID: 24436085
You can calculate the index if you take into accout that the alphabet is consecutive and the ASCII characters are also, e.g.
#include <ctype.h>
 
// ...
 
if (isupper(cTotalImage[iDecodeIndex]) { // uppercase character
 
  iDecimals[0] = cTotalImage[iDecodeIndex] - 65; // ASCII 'A' == 65
}
 
if (islower(cTotalImage[iDecodeIndex]) { // lowercase character
 
  iDecimals[0] = cTotalImage[iDecodeIndex] - 97 + 25; // ASCII 'a' == 97, add offset until 'Z' in your array
}
 
if (isdigit(cTotalImage[iDecodeIndex]) { // 0 - 9
 
  iDecimals[0] = cTotalImage[iDecodeIndex] - 48 + 50; // ASCII '0' == 97, add offset until 'z' in your array
}
 
// add special treatment for +/

Open in new window

0
 

Author Closing Comment

by:ehensens
ID: 31583702
I like this approach, good thinking.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

877 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question