Basit XOR Decoder
Açıklama :
Bu kodu yaklaşık 1 sene önce ödevim olduğu için yazmıştım bu yüzden bazı kısıtlamalara uymak zorunda kaldım. (fonksiyon vs. kullanımı yasaktı) Birilerinin işini görebilir :)
Örnek Kodlar :
Binary, secred code z : 001111000000111100001000000100010001101100010100
Octal, secred code z : 074017010021033024
Decimal, secred code z : 060015008017027020
Kaynak Kod :
/* Simple Decoder V1.0
*
* Furkan TOKAC
* OS Ubuntu 14.04
*
*/
#include <stdio.h>
int main()
{
int choice=1, counter=0;
char sc='A'; // sc means secretCode
long scBin=1000001; // scBin=Binary of secret code(default A)
while(choice != 3)
{
printf("Happy Decoder!\n");
printf("(1) Decode text\n");
printf("(2) Change the secret code\n");
printf("(3) Quit\n");
printf("You choose: ");
scanf("%d", &choice);
switch(choice)
{
//---CASE 1------------------------------------------
case 1:
counter=0;
int base=2, digit=0, match=0, decCh=0, decimal=0; // decCh=decimal of 3char
char txCode; // Code which is entered by user
long binCh=0, scTemp=scBin, binary=0; // binCh=binary of current character
printf("You have chosen option 1\n");
printf("Which base will you use to enter text (base 10/8/2)? ");
scanf("%d", &base);
if( base!=10 && base!=8 && base!=2 )
{
printf("Invalid base. Try again...\n");
break;
}
while(getchar() != '\n'); // fflush has problem in linux so I created a statement to handle problem
printf("Please enter the text to decode: ");
scanf("%c", &txCode);
printf("Your Decoded text is: ");
switch(base)
{
//---BINARY-----------------
case 2:
while(txCode != '\n')
{
counter++;
binary*=10;
if(txCode == '1') // save entered binary to "binary" variable
binary += 1;
if(counter == 8) // If first 8 char digit taken, we handle it. If user enter missing char, we won't handle it
{
for(scTemp=scBin,counter=0, digit=1; counter<8; counter++) // binary xor secredcode(scTemp) { if((scTemp%10) != (binary%10)) binCh += digit; digit*=10; scTemp/=10; binary/=10; } for(base=0,digit=1;binCh > 0;) // XORed binary to decimal
{
base += (binCh%10)*digit;
digit*=2;
binCh/=10;
}
printf("%c", base);
binary=0;
counter=0;
}
scanf("%c", &txCode);
}
break;
//---OCTAL------------------
case 8:
while(txCode != '\n')
{
counter++;
for(match=0; (48+match) != (int)txCode; match++); // match will be int of char
// I don't wanna reverse and do more work to get octal. I basically did following.
if(counter == 1)
decCh = match*100;
else if(counter == 2)
decCh += match*10;
else if(counter == 3)
decCh += match;
if(counter == 3) // If first 3 char digit taken, we handle it. If user enter missing char, we won't handle it
{
for(digit=1,decimal=0; decCh>0;) // octal to decimal
{
decimal += (decCh%10)*digit;
digit*=8;
decCh/=10;
}
for(digit=1,binary=0; decimal>0;) // decimal to binary
{
binary += (decimal%2)*digit;
digit*=10;
decimal/=2;
}
for(scTemp=scBin,counter=0,digit=1; counter<8; counter++) // binary xor secredcode(scTemp) { if((scTemp%10) != (binary%10)) binCh += digit; digit*=10; scTemp/=10; binary/=10; } for(base=0,digit=1;binCh > 0;) // XORed binary to decimal
{
base += (binCh%10)*digit;
digit*=2;
binCh/=10;
}
printf("%c", base);
counter=0;
decCh=0;
}
scanf("%c", &txCode);
}
break;
//---DECIMAL----------------
case 10:
while(txCode != '\n')
{
counter++;
for(match=0; (48+match) != (int)txCode; match++); // match will be int of char
// I don't wanna reverse and do more work to get decimal. I basically did following.
if(counter == 1)
decCh = match*100;
else if(counter == 2)
decCh += match*10;
else if(counter == 3)
decCh += match;
if(counter == 3) // If first 3 char digit taken, we handle it. If user enter missing char, we won't handle it
{
for(digit=1,binary=0; decCh>0;) // decimal to binary
{
binary += (decCh%2)*digit;
digit*=10;
decCh/=2;
}
for(scTemp=scBin,counter=0, digit=1; counter<8; counter++) // binary xor secredcode(scTemp) { if((scTemp%10) != (binary%10)) binCh += digit; digit*=10; scTemp/=10; binary/=10; } for(base=0,digit=1;binCh > 0;) // XORed binary to decimal
{
base += (binCh%10)*digit;
digit*=2;
binCh/=10;
}
printf("%c", base);
counter=0;
decCh=0;
}
scanf("%c", &txCode);
}
break;
}
printf("\n");
break;
//---CASE 2------------------------------------------
case 2:
while(getchar() != '\n'); // fflush has problem in linux so I created the statement to handle problem
printf("You have chosen option 2\n");
printf("Which secret code will you use? ");
scanf("%c", &sc);
printf("Binary equivalent of the chosen code is ");
int scDec = (int)sc, decade=1;
for(counter=0,scBin=0; scDec>0; counter++)
{
scBin += (scDec%2)*decade;
decade *= 10;
scDec /= 2;
}
for(; (8-counter)>0; counter++) // Write zeros if it necessary for 8bit binary
printf("0");
printf("%ld\n", scBin);
break;
//---CASE 3------------------------------------------
case 3:
printf("You have chosen option 3\n");
break;
default:
printf("Invalid choice. Try again...\n");
break;
}
printf("\n");
}
printf("Bye bye!\n");
return 0;
}