Solved

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

Posted on 2009-05-20
4
443 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 84

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 500 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

VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

Question has a verified solution.

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

C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…

777 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