ints to dword

Status
Niet open voor verdere reacties.

IkBenHetMaar

Gebruiker
Lid geworden
23 mrt 2012
Berichten
18
Hallo iedereen

ik zit met het volgende:

ik heb 4 getallen
bv
192
168
10
11

die 4 getallen zijn een dotted quad ip adres

IP dotted quad IP decimal IP hex
192.168.10.11 3232238091 C0A80A0B

ik zou daar graag een IP decimal van willen maken in een DWORD en een IP Hex ook in een DWORD


Met dank
IkBenHetMaar

IP_DEC_1:= IP_NUM_1 * 16777216;
IP_DEC_2 := IP_NUM_2 * 65536;
IP_DEC_3 := IP_NUM_3 * 256;
IP_DEC_4 := IP_NUM_4;
Base10IP := IP_DEC_1 + IP_DEC_2 + IP_DEC_3 + IP_DEC_4;
 
Laatst bewerkt door een moderator:
Gezien een dotted IPv4 adres gewoon in een 32 bits waarde past, heb je aan een (32 bits :p) int voldoende hoor. Er zijn meerdere mogelijkheden om het gewenste resultaat te bereiken. Zo zou je bijvoorbeeld iets als het onderstaande kunnen schrijven:

[cpp]
typedef unsigned char octet; // je zou uiteraard ook gewoon een unsigned char als paramater kunnen gebruiken, maar dit vind ik persoonlijk netter

unsigned int toDottedIP(const octet o1, const octet o2, const octet o3, const octet o4) {
return (o1 << 24) | (o2 << 16) | (o3 << 8) | o4;
}

std::cout << "IP: " << toDottedIP(192, 168, 10, 11) << std::endl;
[/cpp]

Indien je niet bekend bent met bitshifting, zullen de '<<' (leftshift operator) operator en de '|' (bitwise OR) operator je waarschijnlijk niet bekend voorkomen. Een uitleg over de werking van deze operators is te vinden via: http://www.cprogramming.com/tutorial/bitwise_operators.html Na het lezen van de uitleg zal het waarschijnlijk nog niet helemaal duidelijk zijn hoe de code precies werkt, en is het wellicht verstandig om alle berekeningen die in de voorbeeld code worden uitgevoerd eens volledig uit te schrijven. Op die krijg je een goed beeld van welke stappen er precies uitgevoerd worden om tot het gewenste resultaat te komen. Wat je overigens ook zou kunnen doen is een union gebruiken voor dit probleem (zie http://www.cplusplus.com/doc/tutorial/other_data_types/ indien je niet bekend bent met de werking van een union), waardoor je bijvoorbeeld ook iets als het onderstaande kunt schrijven:

[cpp]
typedef unsigned char octet;

typedef union {
typedef struct {
octet o1, o2, o3, o4;
} t_octets;

t_octets octets;
unsigned int IP;
} t_dottedIP;

t_dottedIP toDottedIP(const octet o1, const octet o2, const octet o3, const octet o4) {
t_dottedIP ip;
ip.octets = {o4, o3, o2, o1};
return ip;
}

std::cout << "IP: " << toDottedIP(192, 168, 10, 11) << std::endl;
[/cpp]

Door gebruik te maken van een union is het ook vrij makkelijk om het omgekeerde te doen (en zijn beide waardes ook altijd bij de hand), en zou je dus ook het onderstaande kunnen schrijven:

[cpp]
void printDottedIP(const t_dottedIP &ip) {
std::cout << (unsigned int)ip.octets.o4 << "." << (unsigned int)ip.octets.o3 << "." << (unsigned int)ip.octets.o2 << "." << (unsigned int)ip.octets.o1 << std::endl;
}
// ...
t_dottedIP ip;
ip.ip = 3232238091;
printDottedIP(ip);
[/cpp]

Verder is het hexadecimaal/decimaal tonen van de waardes slechts een notatie, en hoef je deze waardes dus ook niet apart te berekenen of op te slaan. Hiervoor kun je namelijk gewoon iets als het onderstaande schrijven:

[cpp]
std::cout << "DEC IP: " << std::dec << ip.ip << std::endl; // std::dec is uiteraard niet nodig in dit voorbeeld, maar mocht je hem nog niet kennen dan ken je hem nu :)
std::cout << "HEX IP: " << std::hex << ip.ip << std::endl;
[/cpp]

Indien je er met de bovenstaande informatie nog niet helemaal uitkomt of wellicht niet alles volledig begrijpt, dan moet je het maar laten weten en zal ik of een andere user het nog wel verder toelichten. Maar probeer het wel eerst zelf!

*disclaimer: de voorbeelden zijn geschreven op een systeem dat gebruikt maak van little endianness, en kunnen op een systeem dat gebruik maakt van een ander type endianness dus ook andere resultaten opleveren dan hierboven worden aangegeven. Meer over endianness kun je vinden via: http://en.wikipedia.org/wiki/Endianness
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan