PDA

Visualizza la versione completa : [C++] Convertire indirizzo IP da stringa a binario


88prototipo
30-11-2010, 15:58
ciao a tutti, chi sa dire come faccio a convertire un indirizzo ip che mi viene passato come stringa, in indirizzo ip in binario?

del tipo 0.0.0.10 ---> 00000000.00000000.00000000.00001010 ?

grazie mille

MItaly
30-11-2010, 16:18
Devi prima di tutto convertire le singole componenti dell'IP in interi (puoi usare un istringstream), e quindi convertirle in binario (l'algoritmo molto semplice, sono sicuro che ci puoi arrivare da solo).
Per inciso, a cosa ti serve la conversione in binario?

GliderKite
30-11-2010, 17:33
Riallacciandomi a quello che ha detto MItaly, se ci sono problemi qua c' un esempio in C++. Ma a cosa ti serve?



#include <vector>
#include <string>
#include <algorithm>
#include <sstream>




std::vector <unsigned> IPtoBin( std::string &text )
{
delDot( text );

return dectobin( stouint(text) );
}



void delDot( std::string &text )
{
std::string::size_type pos = text.find(".");

while( pos != std::string::npos )
{
std::string::const_iterator it = text.begin() + pos;
text.erase( it );

pos = text.find(".");
}
}


unsigned stouint( const std::string &text )
{
std::stringstream sstream;
sstream << text;

unsigned uint;
sstream >> uint;

return uint;
}


std::vector <unsigned> dectobin( unsigned uint )
{
typedef std::vector <unsigned>::size_type VectorSize;

std::vector <unsigned> binary;

for( VectorSize value = 1; value <= uint; value *= 2 )
binary.push_back(value);

std::reverse( binary.begin(), binary.end() );


VectorSize myVectSize = binary.size();

for( VectorSize i = 0; i != myVectSize; ++i )
{
unsigned temp = binary[ i ];
binary[ i ] = uint / binary[ i ];
uint = uint % temp;
}

return binary;
}

88prototipo
30-11-2010, 20:03
grazie, mi serve per un progetto scolastico.... mi arriva un pacchetto, leggo l'indirizzo ip sotto forma di stringa e poi devo lavorare sui singoli bit.

Ho provato il codice ma mi dice unable to open include file 'sstream.h'

Provo ad utilizzare un altro programma, magai c++ primer e poi vi faccio sapere come va.

Se no ho trovato un codice che mi converte una stringa di numeri in binario,



#include <stdio.h>

#define LEN_BINSTR_INT (sizeof (int)*8)


//funzione che converte in binario passandogli un valore in decimale
char *binstr_int (char *bufout, int value)
{
unsigned int m;
char *ret = bufout;

for (m=1<<(LEN_BINSTR_INT-1); m!=0; m>>=1)
*bufout++ = value & m ? '1' : '0';
*bufout = '\0';

return ret;
}



int main (void)
{
char str[LEN_BINSTR_INT+1]; //il +1 serve per il /0 che il terminatore della stringa

printf ("%s\n", binstr_int (str, 255));


return 0;
}




ma il problema che non riesco a dividere l'ip in 4 sottostringhe divise dal '.' ... C' una funzione che divide la stringa che gli passo in base al carattere separatore? ho provato a cercare e ho trovato la funzione split, ma non sono riuscito ad implementarla

GliderKite
30-11-2010, 20:42
Che compilatore/IDE usi?

Ma lo devi fare in C o in C++?
Perch anche se non sembra le cose possono cambiare decisamente...

Basandomi sul titolo della discussione ti posso dire che la classe std::string implementa metodi che possono esserti utili (se guardi il mio esempio, fatto proprio per avere una base "didattica", te ne renderai conto).

Guardati: string (http://www.cplusplus.com/reference/string/string/)

MItaly
30-11-2010, 21:10
Originariamente inviato da 88prototipo
grazie, mi serve per un progetto scolastico.... mi arriva un pacchetto, leggo l'indirizzo ip sotto forma di stringa e poi devo lavorare sui singoli bit.

Ho provato il codice ma mi dice unable to open include file 'sstream.h'
La direttiva


#include <sstream>, senza il .h (qualora ce l'avessi aggiunto tu).

88prototipo
30-11-2010, 21:15
utilizzo Borland C++ 5.02 ( un po' vecchiotta come versione) e devo farlo in C++.

Per il problema sstream.h, io ho solo copiato il codice che mi ha postato GliderKite, senza alcuna modifica... Per mi ha dato questo problema

YuYevon
30-11-2010, 21:18
Originariamente inviato da 88prototipo
utilizzo Borland C++ 5.02 ( un po' vecchiotta come versione) e devo farlo in C++.


Installa qualcosa di pi dignitoso e non avrai quel problema.

88prototipo
30-11-2010, 21:22
:stordita: era quello che usavo 6 anni fa :confused:
ora installo dev-C++

GliderKite
30-11-2010, 21:27
Originariamente inviato da 88prototipo
:stordita: era quello che usavo 6 anni fa :confused:
ora installo dev-C++

Dev-C++ un progetto non pi attivo, oltretutto personalmente non lo trovo proprio il massimo...

Se hai la possibilita ti consiglio: VS express edition (Visual C++) (http://www.microsoft.com/express/Downloads/#2010-Visual-CPP)

Loading