[Solved] Can I include extended ascii codes in my application?
-
wrote on 28 Feb 2012, 16:33 last edited by
I am using the following code for converting a string to ASCII. Then I am adding a random value on the ASCII and converting back...
So 'A' would be 65 + 3 that results in 68 which is 'D'. Works perfectly so far. The problem appears when adding 'z' (122) with more or equal to 5...Then according to the ASCII table, character 127 is DEL (program displays funny character) or if greater, then it is in the extended ASCII code region...
Is there a way to include those so the program would still convert?
Thank you in advance.
@
key = 5;
input_string = ui->lineEdit->text();for(int i = 0; i < input_string.length(); i++) { random = input_string.at(i).toAscii(); result1.append(QChar(random + key).toAscii()); } ui->lineEdit_3->setText(result1);
@
I am including two attachments as well to see the actual output.
-
wrote on 28 Feb 2012, 16:49 last edited by
It's hard to say exactly. Can I ask what you're trying to accomplish in your program? Perhaps it's your algorithm which might be improved upon, rather than trying to fix this particular implementation.
But without a clearer picture of what you're trying to do, it's hard to suggest what a "right" or "wrong" solution might be.
-
wrote on 28 Feb 2012, 17:12 last edited by
Thanks for your prompt reply, again. Alright, let's see...
I'm trying to make an application similar to the functionality of Caesar's cipher...
http://en.wikipedia.org/wiki/Caesar_cipher
I would like to be able to swap characters' ASCII representation according to the value of the 'secret' key...The difference is that, Caesar's cipher is only applied to the alphabet, whereas I want to include the entire ASCII table for a more complicated output let' say.
-
wrote on 28 Feb 2012, 17:34 last edited by
Do you really want the entire ASCII table, or do you just want the 7-bit printable characters? If you want the latter, then you'll need to do some more clever rotation than just adding values.
Assuming the printable characters are 32 (SPACE) - 126 (Tilde) then you could do something like:
@
char val;
char offset;if (val >= 32 && val <= 176)
{
val -= 32; // Shift the working range from [32-126] -> [0->94] for ease of calculations
val += offset;
if (val < 0) { val += 94; } // Offset could be negative, I suppose.
if (val > 94) { val -= 94; } // Keep the shifted values in range. --
val += 32 // Shift the character set back into the printable range
}@
Just brain to keyboard. Your mileage may vary.
[Edit: Tilde is 126, not 176.]
-
wrote on 28 Feb 2012, 17:37 last edited by
Additionally, you might consider printing the values in hex in your text item, rather than in decimal, as the hex values should ideally all be 2 characters instead of 1 to 3 characters.
-
wrote on 28 Feb 2012, 17:39 last edited by
I suppose that should be placed inside the loop?
-
wrote on 28 Feb 2012, 17:43 last edited by
I would put this functionality into its own method, then call the method from inside your loop.
@
char MyClass::convertCharacter(char val, char offset) { }
@
or something like that. -
wrote on 28 Feb 2012, 17:45 last edited by
Got it, thank you!
-
wrote on 28 Feb 2012, 17:46 last edited by
No problem. The nice part is that you can then use that same method to convert back the other way by just using a negative offset.
_Edit to add: _
Also, I used chars, but you might want to use a temporary int (or short) variable for the calculations to reduce the possible effects of overflow, should the offset be too high or low.
-
wrote on 28 Feb 2012, 18:25 last edited by
My code now looks like this...
@
key = 20;
input_string = ui->lineEdit->text();for(int i = 0; i < input_string.length(); i++) { random = input_string.at(i).toAscii(); //result1.append(QChar(random).toAscii()); if ((random) >= 32 && (random) <= 176) { random -= 32; random += key; if (random < 0) random += 144; if (random > 144) random -= 144; random += 32; } result1.append(QChar(random).toAscii()); ui->lineEdit_3->setText(result1);
@
It works when the key is small but it malfunctions when the key gets bigger, i.e. 20. When the key is big, it still provides an output, but when you try to select it, then it crashes...I guess there are some 'funny' characters that cannot be read...Because when I copy it and paste it somewhere else it displays this:
{y{y{
In addition, I noticed it malfunctions most of the time with letter 'z'...no clue.
-
wrote on 28 Feb 2012, 18:31 last edited by
Yes, anything equal or more than 5 causes a problem if the letter 'z' is used...
-
wrote on 28 Feb 2012, 18:49 last edited by
It would have helped if I had used the decimal value for ~ (126) rather than the octal value (0176).
So change all the 176s to 126, and change all the 144s to 94.
I edited my earlier example to reflect this correction.
-
wrote on 28 Feb 2012, 18:55 last edited by
The following works for me:
@
#include <QDebug>
#include <QString>int main(int argc, char** argv)
{
int key = 20;QString input_string; for (int idx = ' '; idx <= '~'; idx++) { input_string.append(QChar(idx)); } qDebug() << input_string; QString result1; int random = 0; for (int i = 0; i < input_string.length(); i++) { random = input_string.at(i).toAscii(); if ((random) >= 32 && (random) <= 126) { random -= ' '; random += key; while (random < 0) random += 94; while (random > 94) random -= 94; random += ' '; } result1.append(QChar(random).toAscii()); } qDebug() << result1; return 0;
}
@ -
wrote on 28 Feb 2012, 18:57 last edited by
Already done that and works perfectly. Tested up to key 20...do you think I can go further? or I would start getting crashes?
-
wrote on 28 Feb 2012, 19:01 last edited by
Change the two inner ifs to whiles, and then it should always keep your resultant strings within bounds (for instance if the offset were > 94).
As for crashes, see for yourself. And if you were to crash, it would be a good opportunity to practice debugging.
-
wrote on 28 Feb 2012, 19:22 last edited by
Seems good thank you.
For now, I will keep the key small and maybe later develop this further.
Anyhow, thanks again!
-
wrote on 28 Feb 2012, 19:38 last edited by
One small addition: as you know the length of the resulting string in advance you should reserve it using QString::reserve(). This will save, depending on the length of the string, a bunch of reallocations, which might or will have an impact on your performance, especially if the "transformation function" is called often.
-
wrote on 28 Feb 2012, 19:45 last edited by
Good suggestions indeed, but that function will not be called that often. Just once actually for the user to enter the message and get it 'encrypted'.
Thanks for the suggestion though.
2/18