[Solved] Can I include extended ascii codes in my application?
-
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.]
-
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.
-
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.
-
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;
}
@ -
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.
-
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.