# Thread: Newbie: Some help with ASCII

1. ## Newbie: Some help with ASCII

Well this is my first post on the forum. Been browsing the site for some days but i need some quick help so figured, why not go here?

Well im pretty new to this whole programming thing, although ive made a few programs. My pride and joy is a program to handle prime numbers. You set up an interval of your choosing and then the program will find all the prime numbers in the interval. You can input a single number within the interval and the program will then find the neares prime number above and below. You can output a complete list of the primes in the interval and save them in a file... and i think also some other stuff...

The point is that i know a little but i dont realy know anything about ASCII. Not true, i know what it is but i dont know how to work with it. Im trying to make a simple encryption and decryption program where the ASCII values are changed. I.e. five is added so that "a" (97) becomes "f" (102) but i have no idea on how do actualy do this. I hope some of you guys in here can help me?

2. ASCII pairs each character with an integer, like 97 for 'a'. Because of this, you can cast back and forth between chars and ints (Just be careful you don't lose important information). You can therefore add integers to chars and chars to chars.
Code:
```	string plaintext = "theeaglefliesatmidnight";
string ciphertext;
int n = plaintext.length();
int offset = 3;
for(int i =0; i < n; ++i)
{
ciphertext += ( ( (plaintext[i] - 'a') + offset) % 26) + 'a';
}
cout << ciphertext << endl;```
This code implements a Caesar cipher.

plaintext[i] is the ith letter in that string.
I subtract 'a' so that the lowercase alphabet is shifted to [0-25].
I add the offset. This is the part that actually does the encryption. 'a' becomes 'd', etc.
I modulo 26 so that 'z' will become 'c', etc. This part is important.
And finally, I add 'a' back so that the lowercase alphabet displays its proper ASCII values.

3. Code:
```char letter = 'a';
letter += 5;
cout << letter;```
Which is OK while everything remains printable, but usable encryption needs to
a) deal with binary data
b) is likely to output binary data

4. Originally Posted by Salem
Which is OK while everything remains printable, but usable encryption needs to
a) deal with binary data
b) is likely to output binary data
Tell that to Caesar, everyone in WWII, and everyone living in between

SilverAdder, after you understand the Caesar cipher, I suggest you implement the Vigenere cipher and after that some digraph ciphers.

I wouldn't send any credit card numbers using the Playfair cipher, but let's face it: Classical Cryptography is much more fun.

5. ... All i heard was ASCII and then... white noise. No seriously im so lost. The only reply i realy understood was Salems. So thanks dude I didnt know you could just do it like that. But the wouldnt work if there were more letters would it? I dont suppose i can just set up an array and then add five to the entire array...

6. Because strings resize themselves nicely, that code will work on a plaintext message of any length. It doesn't, however, deal with any characters other than lowercase letters.

A std::string is not an array.
If you do something like
an_array+5;
that will not do what you think. You'll learn more about that when you learn pointers. For now, I suggest using std::string as they're much easier to use.

In order to do something to every member of a string or array, you should loop over every element in them. For example,
Code:
```string s = "SilverAdder";
int n = s.length();
for(int i = 0; i < n; ++i)
cout << s[i] << endl;```
Would output:
S
i
l
v
e
r
A
d
d
e
r

7. Im with you so far. I en up with this:

Code:
```#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int n;
int i;
//int e;

int main()
{
n = s.length();

for(i = 0; i < n; i++)
{
cout << s[i] << endl;
}
getch();
return 0;```
And it works just like you said. But how do i change the ASCII values for the text in the loop?

8. Depends on what you want to change them to, but you can more or less treat them like integers using +, -, and %. For the Caesar cipher, add 3 to each char and modulo 26.

Don't use global variables. Those declarations should go inside of main().

9. Alright thanks. Ill experiment a little with this. And thanks for the pointer on globals. Ill remember that Ill give a shout here once i get stuck again

11. Well, seems i finaly made what i wanted to! Not the most comprehencive program but still... its more than ive ever made before Its probably not the best method but still it works... I descided to typecast the loop and add 5. Lots of parentheses but it gets the job done

Code:
```
#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
int n = tekst.length();

for(int i = 0; i < n; i++)
{
cout << tekst[i] << endl;
}
getch();

cout << endl;

for (int i = 0; i < n; i++)
{
cout << (char)(((int)tekst[i])+5) << endl;
}
getch();

return 0;
}```

12. Hi,

1) Since you are apparently trying to learn C++, get rid of

<conio.h>, <cstdlib> and getch()

See here:

http://faq.cprogramming.com/cgi-bin/...&id=1043284385

2) You need to include <string> for string types.

3) C++ casts look like this:

static_cast<char>(88)

In addition, if you add an integer to a char like this:

tekst[i] + 5

the compiler can't add two differing types, so it automatically converts tekst[i] from char to int. Then, the compiler has two int's, so it adds 5 creating an int result. So, you can do this:

static_cast<char>(tekst[i] + 5);

The result from the addition is an int, which is then cast to a char.

13. Alright i tried getting rid of getch() but i couldnt get cin.get to work. The program never paused, it just ran through it all and closed. I left the code in there if somecan give me a hand, otherwise im just gonna use getch.

Now i also tried to change it so that i can encrypt af user input and it sort of works. The problem is that if the input cintains a space, the encryption screws up and not all the text gets encrypted, or something like that. At any rate, the decrypted tekst isnt identical to the original input.

I included af copy of the first code at the end of the program, but without the input being controlled by the user. As much for my own sake as anything else... I hope you guys can help me with this...

Code:
```
#include <iostream>
#include <conio.h>

using namespace std;

char key[13]="ABCDEFGHIJKL";

int main()
{
char input[13];
cin >> input;

for(int x=0; x<12; x++)
{
input[x] = input[x]^key[x];
cout << input[x];
}
cout << endl;

for (int x=0; x<12; x++)
{
input[x] = input[x]^key[x];
cout << input[x];
}
cout << endl << endl;

/*  cin.ignore();
cout << "Press Enter" << endl;
cout << endl;
cin.get(); */
getch();

cout << input2 << endl;
for (int x=0; x<12; x++)
{
input2[x] = input2[x]^key[x];
cout << input2[x];
}
cout << endl;

for (int x=0; x<12; x++)
{
input2[x] = input2[x]^key[x];
cout << input2[x];
}
/*  cout << endl << endl;
cout << "Press Enter" << endl;
cout << endl;
cin.get(); */
getch();
return(0);
}```

14. FAQ > How do I... (Level 1) > Stop my Windows Console from disappearing everytime I run my program?
http://faq.cprogramming.com/cgi-bin/...&id=1043284385

I suggest using std::strings rather than arrays of chars.

Most people don't bother encrypting spaces. Instead, they just smush all the letters together and then encrypt or decrypt. I suggest writing a function to remove the whitespace from a string. The function isspace() in <cctype> will help with that.

15. The program never paused, it just ran through it all and closed. I left the code in there if somecan give me a hand, otherwise im just gonna use getch.
cin.get() will only pause if there is no more input to read. The reason it pauses is because it needs input.

When you enter input in the console, it doesn't matter whether a previous read attempt only read part of the input that was entered--the rest of the input still remains and is waiting to be read. If cin.get() is executed when there is still input available, it does not have to wait for user input, and so it reads in a char and your program ends.

The problem is that if the input cintains a space, the encryption screws up and not all the text gets encrypted, or something like that.
This line:
Code:
`cin >> input;`
causes input to stop being read in when a space is encountered--that is the way ">>" is defined to work. To read in a whole line of data--spaces and all--you need to use getline():
Code:
```char input[13];
cin.getline(input, 13);```
That will read in a maximum of 12 characters from the console, and tack on a '\0' character in the last spot in the array.