SMS zprávy jsou v mobilních sítích pred prenosem kódovány následujícím zpusobem:
| t | e | s | t | o | v | a | c | i | S | M | S |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 116 | 101 | 115 | 116 | 111 | 118 | 97 | 99 | 105 | 83 | 77 | 83 |
| 01110100 | 01100101 | 01110011 | 01110100 | 01101111 | 01110110 | 01100001 | 01100011 | 01101001 | 01010011 | 01001101 | 01010011 |
| 1110100 | 1100101 | 1110011 | 1110100 | 1101111 | 1110110 | 1100001 | 1100011 | 1101001 | 1010011 | 1001101 | 1010011 |
| 1110100 | 1100101 | 1110011 | 1110100 | 1101111 | 1110110 | 1100001 | 1100011 | 1101001 | 1010011 | 1001101 | 1010011 |
Pátý rádek a následující tabulka ilustrují vlastní kódování:
| 11110100 | 11110010 | 10011100 | 11111110 | 10110110 | 10000111 | 11000111 | 11101001 | 01101001 | 01110011 | 1010 | |
| F4 | F2 | 9C | FE | B6 | 87 | C7 | E9 | 69 | 73 | 0A |
Poslední rádek pak predstavuje zakódovanou SMS (v sestnáctkové soustave).
Vytvorte program, který bude prevádet soubor predstavující SMS do výse uvedeného formátu a naopak:
e (encoding) nebo d (decoding),
#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;
}