Waňov web

PB161 Jazyk C++ - 10. cvicení

Prevod textu do binární podoby SMS a naopak

Úvod:

SMS zprávy jsou v mobilních sítích pred prenosem kódovány následujícím zpusobem:

testovaciSMS
1161011151161111189799105837783
011101000110010101110011011101000110111101110110011000010110001101101001010100110100110101010011
111010011001011110011111010011011111110110110000111000111101001101001110011011010011
111010011001011110011111010011011111110110110000111000111101001101001110011011010011

Pátý rádek a následující tabulka ilustrují vlastní kódování:

11110100111100101001110011111110101101101000011111000111                111010010110100101110011        1010
F4F29CFEB687C7 E969730A

Poslední rádek pak predstavuje zakódovanou SMS (v sestnáctkové soustave).

Zadání:

Vytvorte program, který bude prevádet soubor predstavující SMS do výse uvedeného formátu a naopak:

  1. program bude volán se 3 parametry,
  2. první parametr bude e (encoding) nebo d (decoding),
  3. druhý parametr bude jméno vstupního souboru k zakódování/dekódování,
  4. tretí parametr bude jméno výstupního zakódovaného/dekódovaného souboru.

Pozadavky:

Poznámky:


Riešenie:


sms.C
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;

int i;
char znak,znak2,znak3='\0';
string SMS;
//------------------------NAPOVEDA----------------------------------------------
void napoveda()
{
 cerr<<"Program SMS sluzi na prevod textu do binarnej podoby sms\n"
       "POZOR, zadali ste nespravne parametre!!! Spravne pouzitie:\n\n"
       "sms X vstupny_subor vystupny_subor \n"
       "- X=e pre zakodovanie \n"
       "- X=d pre dekodovanie \n";
}
//==========================MAIN================================================
int main(int argc,char* argv[])
{
//---------------------VSTUPNE PARAMETRE----------------------------------------
 if(argc==4)
  {
   if((argv[1][0]=='e' || argv[1][0]=='d') && argv[1][1]=='\0')
    {
     fstream(vstup);
     vstup.open(argv[2],ios_base::in);
     if(!vstup) {cerr<<"Nepodarilo sa otvorit vstupny subor.\n";
                 return 3;}

     fstream(vystup);
     vystup.open(argv[3],ios_base::out|ios_base::ate);
     if(!vystup) {cerr<<"Nepodarilo sa otvorit vystupny subor.\n";
                 return 4;}
     vstup.close();vystup.close();
    }else{napoveda();return 2;}
  }else {napoveda();return 1;}

//------------------------------------------------------------------------------

 ifstream vstup(argv[2],ios::in);
 ofstream vystup(argv[3],ios::trunc|ios::out);

if (argv[1][0]=='e'){
//==================Zakodovanie SMS=============================================
//------------------Nacitanie SMS do pamati-------------------------------------
 while(vstup.get(znak))
  {
   if((znak>126) || (znak<32 ))
     {cerr<<"Subor obsahuje nestandardne znaky: "
          <<"ASCII kod:"<<static_cast<int>(znak)<<endl;return 5;}
   SMS+=znak;
  }
//---------------Zakodovanie 8->7 ----------------------------------------------
 i=0;znak2='\0';
 while(i < static_cast<int>(SMS.size()))
 {
  if((i%8)==7) {i++; continue;}

  znak=SMS[i];
  znak3=znak2=SMS[i+1];
  znak=znak>>(i%8);         // posun bitov
  znak3=znak3<<(7-(i%8));

  vystup<<static_cast<char>(znak+znak3);
  i++;
 }
}
//=================Dekodovanie SMS =============================================
else
{
 for(i=0;vstup.get(znak);i++)
 {
  znak2=znak;  
  znak2=znak2<<((i%7)+1);
  znak2=(znak2>>((i%7)+1)<<(i%7));
  
  vystup<<static_cast<char>(znak2+znak3);
  if((i%7)==6 && ((znak>>1)!=0))                      // Bajt navyse
    {vystup<<static_cast<char>(znak>>1); 
     znak3='\0';}
  else znak3=znak>>(7-(i%7));
 }
}
//----------------Koniec dekodovania--------------------------------------------

 cout<<endl;
 return 0;
}



Nahor