Avatar billede quiw Nybegynder
09. juni 2005 - 18:03 Der er 23 kommentarer og
1 løsning

Konvertere Char tekst om til Int

GoddaG :) er ved at lave et lille krypterings system.. Hvor man indtaster et stykke tekst.. I det tilfælde ville teksten være "Test" også konvertere programmet ordet "Test" om til tal.. F.eks 45464748 også ganger programmet tallet med F.eks 568 så man får 45464748x568=25823976864 Også printer den 25823976864 på skærmen.. Altså ordet "Test" blev til "25823976864" og når man så vil gøre baglæns.. Tar man 568/25823976864=45464748 som så blir konverteret tilbage til teksten "Test".. Men.. Har et lille problem.. Jeg har en cin som smider det indtastede tekst op i en char [64] Men hvordan får jeg så min char til at blive til int ?.. Har tjekket google og alle andre tråde.. Men det er intet som løser mit spørgsmål godt nok :P

- Altså kort resume.. Jeg ska ha noget tekst i Char til at blive til tal i Int.. :)

Håber i forstår.. Har smidt 200point for et svar som ka hjælpe mig.. Hehe på forhånd tak
Avatar billede bertelbrander Novice
09. juni 2005 - 18:22 #1
Det er ikke helt simpelt.
C og C++ har ikke int's der er store nok til at have enhver char[64] som tal.

Man kunne måske bruge et bibliotek, hvilken kompiler bruger du?
Avatar billede quiw Nybegynder
09. juni 2005 - 18:28 #2
Bruger dev-cpp.. Men tallet blir ik så stort.. Det er bare for at gøre ordet ulæseligt.. om det er x4 eller det er x500 jeg ganger tallet med er ligemeget... Men Char[64] gør jeg lavere.. Regner med det blir til en 12 stykker..
Avatar billede bertelbrander Novice
09. juni 2005 - 18:30 #3
Det letteste var at XOR et tal på hver ciffer i dit char array. Det ville gøre det ulæselig, og kan bruges på store arrays.
Avatar billede quiw Nybegynder
09. juni 2005 - 18:36 #4
Well.. Du ka se sourcen og prøve at hjælpe mig.. Jeg ska udvide min source med et encryption system så man ik ka læse koden direkte fra databasen ved at åbne den i notepad :P

Min source er:

#include <iostream>
#include <fstream>
#include <windows.h>


using namespace std;

int main()
{
    fail:
    system ("cls");
    ifstream input_temp("database.pwd");
   
    char password[64];
    char attempt[64];
   
    cout << "Indtast password: \n";
    cin.getline(attempt,sizeof(attempt));
   
    input_temp >> password;
   
    if ( strcmpi ( password, attempt ) == 0 )
    {
        cout << "Rigtigt! \n";
    }
    else
    {
        cout << "Forkert!\n";
        Sleep (500);
        goto fail;
    }
    system ("pause");
    return 0;
}
Avatar billede bertelbrander Novice
09. juni 2005 - 18:45 #5
Du kan bruge dette efter at du har læst password fra filen:

const char HemmeligKey = 0xA5;

  for(int i = 0; password[0]; i++)
      password[i] ^= HemmeligKey;
Avatar billede quiw Nybegynder
09. juni 2005 - 18:47 #6
Hehe.. Er newbie til C++.. Ka du ik prøve at forklare lidt hva der sker igennem den process der ?.. :)
Avatar billede bertelbrander Novice
09. juni 2005 - 18:51 #7
^ betyder XOR

0 XOR 0 er 0
0 XOR 1 er 1
1 XOR 0 er 1
1 XOR 1 er 0
Avatar billede bertelbrander Novice
09. juni 2005 - 19:04 #8
Et eksempel med et fast password:

#include <iostream>

using namespace std;
const char HemmeligKey = 0xA5;

int main()
{
  char key[] = {213, 196, 214, 214, 210, 202, 215, 193, 0};

  char password[64];
  cout << "Enter password: ";
  cin.getline(password, sizeof(password));

  for(int i = 0; key[i]; i++)
      key[i] ^= HemmeligKey;

  if(strcmp(key, password) == 0)
  {
      cout << "Korrekt" << endl;
  }
  else
  {
      cout << "Error" << endl;
  }
  cout << "Hit any key to exit";
  cin.get();
}
Avatar billede quiw Nybegynder
09. juni 2005 - 19:15 #9
Hehe.. Forstår stadig meget lidt..
Ka du ik prøve at give en kort beskrivelse af:

const char HemmeligKey = 0xA5;

  for(int i = 0; password[0]; i++)
      password[i] ^= HemmeligKey;´

- Altså af hva der sker og såen ?..
Avatar billede quiw Nybegynder
09. juni 2005 - 19:17 #10
Ahh nej ok.. For at spare en masse tid.. Så var det CHar til int vi startede ved.. :P
HVordan får jeg konverteret noget tekst til tal ?..
Avatar billede bertelbrander Novice
09. juni 2005 - 19:19 #11
HemmeligKey er et tilfældig valgt tal, som bliver brugt til at kryptere passwordet.

for(int i = 0; password[0]; i++) løber gennem alle tegn i password, indtil det møder enden.

password[i] ^= HemmeligKey; er det samme som password[i] = password[i] ^ HemmeligKey;

'p' ^ HemmeligKey er 213 og 213 ^ HemmeligKey er 'p', dvs. at hvis man xor'er to gange med det samme tal, er man tilbage til start.

a ^ HemmeligKey er 196
Avatar billede bertelbrander Novice
09. juni 2005 - 19:21 #12
Du kan stadig ikke konvertere tilfældig text til int.

karakteren a har værdien 97, så man kan arbejde med stengen (char array'et) som var det et array af tal.
Avatar billede bertelbrander Novice
09. juni 2005 - 19:28 #13
Hvis dit password højest består af 8 tegn kan du bruge en long long:

#include <iostream>

using namespace std;

int main()
{
  char password[64];
  unsigned long long Key = 0;

  cout << "Enter password: ";
  cin.getline(password, sizeof(password));

  for(int i = 0; password[i]; i++)
  {
      unsigned long long T = password[i];
      Key += T << (i*8);
  }
  cout << "Password: " << Key << endl;
  cout << "Hit any key to exit";
  cin.get();
}
Avatar billede quiw Nybegynder
09. juni 2005 - 19:40 #14
Ka være det bare er mig der ska Gnubbe mig lidt over koden.. Hehe.. Kigger på det og prøver at sætte mig ind i det.. Også prøver jeg lige at skrive igen lidt senere.. :) hvis det er okay :P
Avatar billede quiw Nybegynder
09. juni 2005 - 20:04 #15
Har kigget lidt på det.. Men den siger fejl ved Key.. Burde det ik virke ?:

#include <iostream>
#include <fstream>
#include <windows.h>


using namespace std;

int main()
{
    fail:
    system ("cls");
    ifstream input_temp("database.pwd");
   
    char password[64];
    char attempt[64];
    unsigned long long Key = 0;
   

    cout << "Indtast password: \n";
    cin.getline(attempt,sizeof(attempt));
   
      for(int i = 0; attempt[i]; i++)
  {
      unsigned long long T = attempt[i];
      Key += T << (i*8);
  }
 
    input_temp >> password;
   
   
    if ( strcmpi ( password, Key ) == 0 )
    {
        cout << "Rigtigt! \n";
    }
    else
    {
        cout << "Forkert! \n";
        Sleep (500);
        goto fail;
    }
    system ("pause");
    return 0;
}
Avatar billede bertelbrander Novice
09. juni 2005 - 20:31 #16
strcmp og strcmpi er til at sammeligne strenge.

Du skal konvertere begge dele til long long og sammenligne som med int's
Avatar billede quiw Nybegynder
09. juni 2005 - 20:38 #17
Ja men hvordan konvertere jeg dem ?.. Det er det som egentlig er hele problemet i denne tråd :P
Avatar billede bertelbrander Novice
09. juni 2005 - 20:52 #18
Denne løkke konverterer attempt, du skal gøre det samme med password:
  for(int i = 0; attempt[i]; i++)
  {
      unsigned long long T = attempt[i];
      Key += T << (i*8);
  }
Avatar billede quiw Nybegynder
09. juni 2005 - 20:59 #19
Tror vi misforstår hinanden...
i database.pwd ligger der en krypteret kode som f.eks ku være 87128731278
også når man indtaster sit forsøg blir forsøget kørt igennem en krypterings funktion som konvertere forsøget til tal.. Også derefter sammenligner den Det krypteret forsøg med den første linie i database.pwd

- Dvs. at databasen ik ska krypteres.. den er jo i forvejen krypteret af mig selv.. :P
Avatar billede bertelbrander Novice
09. juni 2005 - 21:26 #20
Du skal så læse den krypterede kode fra database.pwd som en unsigned long long:

unsigned long long password:
input_temp >> password;
Avatar billede quiw Nybegynder
09. juni 2005 - 21:33 #21
Nice :) Nu virker det.. :P Må li prøve at se hvorn man overføre point.. ;)
Avatar billede quiw Nybegynder
09. juni 2005 - 21:35 #22
Okay du må lige hjælpe mig.. Hehe hvordan gir man point ?
Avatar billede bertelbrander Novice
09. juni 2005 - 22:35 #23
Normalt ville du bede mig om at lave et "svar", så ville du få mulighed for at acceptere dette svar, og dermed give mig point.

Men jeg samler ikke på point, så du er nødt til at lave et svar selv, og så acceptere det, så bliver spørgsmålet lukket, og du får dine point tilbage.
Avatar billede quiw Nybegynder
10. juni 2005 - 14:22 #24
Okay.. Men.. Dvs. du har hjulpet mig gratis.. Må sige mange tak så... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester