Zmiana liczb na ascii w c++, szyfrowanie

0

Istnieje około 100 symboli ASCII.
W swoim programie za pomocą rzutowania zmieniam cyfry na symbol, problem pojawia się gdy liczba jest większa niż 100 (a potrzebuję jeszcze większych liczb).

void szyfruj()
{
    a2 = static_cast<char> (a)+32;
    b2 = static_cast<char> (b)+35;
}

Jak inaczej szyfrować te dane lub jak zwiększyć ilość tych symboli?

1

Powyższe możesz sobie skrócić do:

void szyfruj()
{
    a = a2+32;
    b = b2+35;
}

więc żadnych cyfr na symboli nie zmieniasz.
Powiedz po ludzku co chcesz osiągnąć.

0
_13th_Dragon napisał(a):

Powyższe możesz sobie skrócić do:

void szyfruj()
{
    a = a2+32;
    b = b2+35;
}

więc żadnych cyfr na symboli nie zmieniasz.

Powiedz po ludzku co chcesz osiągnąć.

a i b to inty, a2 i b2 to char.
Najpierw wczytuje z pliku a2 i b2, a następnie zamieniam na inty

void deszyfruj()
{
    a = static_cast<int>(a2)-32;
    b = static_cast<int>(b2)-35;
}

W pierwszym poście podałem funkcję do szyfrowania, ale problem występuje, gdy szyfruje int większy od (około) 100. Wtedy zapisuje symbol, jednak po ponownemu wczytaniu i zdeszyfrowaniu wartość to ponad 4 miliiony :p.
Nic dziwnego, bo jest tylko 128 symboli ASCII.
Jak to ominąć?

1
  1. Przeanalizuj ten kod: http://ideone.com/kBpw32
  2. Wywal ten bezsensowny static_cast
  3. Napisz pełną treść zadania
0
_13th_Dragon napisał(a):

Przeanalizuj ten kod: http://ideone.com/kBpw32

  1. Wywal ten bezsensowny static_cast
  2. Napisz pełną treść zadania

1.Nie wiem jak to działa ._.
2.Why?
3.Te szyfrowanie to dla własnych potrzeb (gra), szyfruje dane, aby nie można było tak łatwo oszukiwać.
Chodzi o coś takiego:
Tworzę plik nowy.txt wpisuję symbol $ (ASCII 36), zapisuję z kodowaniem ANSI.
Następnie otwieram plik, przez strumień przenoszę symbol z pliku do zmiennej int przez rzutowanie.
Zmieniam wartość wczytanego inta na 200+ i ponownie otwieram plik, przez strumień rzutuję tego inta na chara i zapisuję.
Przy ponownym deszyfrowaniu powinno zwrócić te 200+, ale nie ma tylu symboli ASCII więc zwraca liczbę>4 mln.
Już rozumiesz? :D

1

Ad 1. nie musisz konwertować pomiędzy char a int.
Ad 2. bo absolutnie nie jasne co chcesz zrobić. Jeżeli masz liczbę>4 mln oznacza to że prawdopodobnie masz gdzieś błąd ze znakiem, podaj kod.

1

Prawde mówiąc, również nie rozumiem co chcesz osiągnąć.
Jakiego strumienia używasz do wczytywania danych?
Jak je konwertujesz?
Może po prostu użyj ROT13 (Lub z dowolnym innym przesunięciem) ?

0

Wszystko działa dobrze do momentu, gdy zmienna osiągnie wartość 100+, więc nie może być błędu w kodzie.

0

Problem widać tu:

#include <iostream>
#include <fstream>

int main() {
    std::fstream dane;
            int e;
            char c;
            dane.open("plik.txt", std::ios::in | std::ios::out);
            dane >> c;
            e=(int)c;
            std::cout << e << "/" << c <<std::endl;
            dane.close();
            dane.open("plik.txt", std::ios::in | std::ios::out);
            std::cin >> e;
            c=(char)e;
            dane << c;
            std::cout << e << "/" << c <<std::endl;
            dane.close();

    return 0;
}

W pliku jest ten symbol: ☺ (ASCII 1).
Po wprowadzeniu wartości 155 i po ponownym uruchomieniu wartość się nie zgadza :p.

1
#include <iostream>
#include <fstream>
 
int main() {
    std::fstream dane;
            int e;
            char c;
            dane.open("plik.txt", std::ios::in | std::ios::out);
            dane >> c; // wczytałeś znak ale w pliku nadal jest ten znak
            e=(int)c;
            std::cout << e << "/" << c <<std::endl;
            dane.close();
            dane.open("plik.txt", std::ios::in | std::ios::out);
            std::cin >> e; // próbujesz znak odczytać jako liczbę więc nic się nie wczytuje w zmiennej e nadal są śmiecie
            c=(char)e; // skoro w e śmiecie to w c też
            dane << c; // wyświietlamy śmiecie
            std::cout << e << "/" << c <<std::endl;
            dane.close();
 
    return 0;
}
1
#include <iostream>
#include <fstream>
 
int main()
  {
   while(true)
     {
      std::ifstream rd("plik.txt");
      char c;
      rd>>c;
      rd.close();
      std::ofstream wr("plik.txt");
      wr<<(int)c;
      wr.close();
      std::cout<<(int)c<<'/'<<c<<std::endl;
      rd.open("plik.txt");
      int e;
      rd>>e;
      rd.close();
      wr.open("plik.txt");
      wr<<(char)c;
      wr.close();
      std::cout<<e<<'/'<<(char)e<<std::endl;
      std::cin.ignore();
     }
   return 0;
  }
0

Zatem symboli ASCII jest nieskończoność? -.-

1

Wniosek genialny, popsułeś kod ponieważ nie znasz najbardziej podstawowych podstaw więc - "symboli ASCII jest nieskończoność".
Ale niczego więcej się nie spodziewałem, jakiś setny raz mówię: - "przeczytaj jakieś podstawy" - a nie rozumiesz tego zdania.

0

Skoro to nie prawda, to jak ma wyświetlać znaki ascii o numerze 128+?

1
#include <iostream>
using namespace std;

int main()
  {
   int x=34564417;
   cout<<"x="<<(char)x<<endl;
   cout<<"x="<<(int)(char)x<<endl;
   return 0;
  }

Po raz sto-pierwszy powtarzam przeczytaj jakiś kurs z podstaw3ami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1