[C++] Decryption: Undoing a circular left binary shift

For anyone stopping by, I needed to make all of the "char" variables unsigned. "unsigned char num, num2, num3;"

Hello. I've searched here and around the internet for an answer and I've found many different variations of a solution to my problem, but my professor said I shouldn't need a template, asm, etc.
I have a file I need to decrypt. The first half was single encrypted and gave me instructions for the next part.
The following text is encrypted using the binary shift to the left. Look up the binary shift operator, and you should be able to figure out what is the operator for a left binary shift as well as how to undo a left binary shift. Good luck!

The 2nd half's 2nd line of encryption is a single circular shift to the left. So I need to shift every char to the right once and have it wrap.

Here is my code (Using a MacBook with xCode):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  #include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream input;
    input.open("/Volumes/NO NAME/CIS5/HW4/extracredit/mystery.dat", ios::binary);
    if ( input.fail() )
    {
        cout << "ERROR";
        return 404;
    }
    
    char nm, nm2, nm3;
    
     while ( !input.eof() )
    {
        input >> nm;
        nm2 = nm ^ 88;
        nm3 = (nm2<<7 | nm2>>1);
        
        cout << nm3;
    }
    
	return 0;
}


And here is my output:
\254\267\2724\260;\2629\262\260\2614\26226\262;\2626\231[1\272::4\264\271\264\2717\267::4\2623\2647\26063\2679\266\220\220\253\264:4\2647:4\264\2713\2646\262\264\271:4\2623\2647\2606\271:\2628:\267\260::\260\2647\2647\263:4\262\262:9\260\2619\2622\264:\263\267\2606]4\2623\26766\267\273\2647\263:\262:\264\271\2627\2619\2748:\2622\272\271\2647\263:4\2621\2647\2609\274\2714\2643::\267:4\2626\2623:]&\267\267\265\2728:4\2621\2647\2609\274\2714\2643:\2678\2629\260:\2679[\26072\274\267\272\2714\267\272621\262\26016\262:\2673\264\263\2729\262\267\272:\2734\260:\264\271:4\262\2678\2629\260:\26793\2679\2606\2623:1\2647\2609\274\2714\2643:\260\271\273\26266\260\2714\267\273:\267\27272\267\2606\2623:1\2647\2609\274\2714\2643:]\243\267\26726\272\261\265\2204\2629\262\264\271\2606\264::6\2621\264:\266\2679\262[1\272:\244\273\264666\262\260;\262\264:\2728:\267\274\267\272:\267\271\262\262\265\266\274\273\264\2712\267\266\2643\274\267\2724\260;\262\262;\26279\262\260\2614\2622:4\264\2713\2609\220\220!\253\240$$\240$$\240$\220\220\220-------------------
\303\357\356\347\362\341\364\365\354\341\364\351\357\356\363! \331\357\365 \350\341\366\345 \342\362\357\353\345\356 \364\350\362\357\365\347\350 \364\350\345 \354\341\363\364 \345\356\343\362\371\360\364\351\357\356 \341\356\344 \367\351\354\354 \342\345 \362\345\367\341\362\344\345\344! \311\356\363\364\345\341\344 \357\346 \363\345\356\344\351\356\347 \355\345 \341\356\371 \363\357\362\364 \357\346 \343\357\356\346\351\362\355\341\364\351\357\356 \357\346 \371\357\365\362 \363\365\343\343\345\363\363, \351\356\363\364\345\341\344 \371\357\365 \367\351\354\354 \360\354\341\343\345 \351\364 \351\356 \371\357\365\362 \355\351\344\364\345\362\355. \317\356 \364\350\345 \342\341\343\353 \357\346 \364\350\345 \354\341\363\364 \360\341\347\345, \371\357\365 \367\351\354\354 \344\362\341\367 \341 \362\345\344\344\351\364 \341\354\351\345\356 (\351\346 \371\357\365 \344\357\356'\364 \353\356\357\367 \367\350\341\364 \364\350\341\364 \354\357\357\353\363 \354\351\353\345, \352\365\363\364 \347\357\357\347\354\345 "\362\345\344\344\351\364 \341\354\351\345\356". \301\342\357\366\345 \364\350\345 \341\354\351\345\356, \371\357\365 \367\351\354\354 \367\362\351\364\345 \364\350\345 \346\357\354\354\357\367\351\356\347:

		  \336 >>

\324\350\351\363 \351\363 \364\357 \362\345\360\362\345\363\345\356\364 \364\350\345 \346\351\356\341\354 \363\364\341\347\345\363 \357\346 \344\345\343\362\371\360\364\351\356\347 \364\350\351\363 \343\350\341\354\354\345\356\347\345 \364\350\362\357\365\347\350 \364\350\345 \365\363\345 \357\346 \342\351\356\341\362\371 \363\350\351\346\364\363 \341\356\344 \370\357\362 \357\360\345\362\341\364\357\362\363.

\303\357\356\347\362\341\364\365\354\341\364\351\357\356\363, \371\357\365 \350\341\366\345 \344\345\346\345\341\364\345\344 \355\371 \343\362\371\360\364\357\354\357\347\371 \343\350\341\354\354\345\356\347\345!!

--------------------

\320\365\362\360\354\345 \355\357\356\353\345\371 \344\351\363\350\367\341\363\350\345\362!!\377\377Program ended with exit code: 0


I've seen people use things we haven't learned yet, like templates and something about _asm and x86 and #define and other things.
I found a post on stockoverflow that made sense to me and I tried to replicate it:
http://stackoverflow.com/a/776797

Any ideas? Is the ONLY way to do this with a template or something?

tl:dr I need help with circular binary shift in C++ and I've searched everywhere.

Thank you for your time!
Last edited on
Use unsigned char, not char. If you shift, say, 11100000 four bits to the right, you want to get back 00001110, but with char (char is usually signed), you'll get 11111110.
Thank you so much helios!

I tried that earlier, but my mistake was:
char num, num2;
unsigned char num3;

I didn't try it on all of the var's because I was worried it would mess up the "num ^ 88" operation. Thank you for telling me to do it again. I was smart enough this time to try it on all of them. Now I realize how silly my thought process was earlier.

I just had a great, "Wow I'm dumb", moment. I love those! Means you learned something and can laugh about it.
Topic archived. No new replies allowed.