2010-11-04 8 views
3

Si j'ai 4 adresse d'octet stocké dans l'adresse de char [4] et le contenu sont:La conversion d'une adresse IP de 4 octets à la notation décimale standard

address[0] = '\x80'; 
address[1] = '\xAB'; 
address[2] = '\x0A'; 
address[3] = '\x1C'; 

// all together: 80 AB 0A 1C 

Je veux le convertir en un tableau de caractères ressemble à "128.171.10.28", puisque 80 dans l'hexagone est 128, AB dans l'hexagone est 171 et ainsi de suite.

Comment est-ce que je peux faire ceci?

+0

"Convertir une adresse IP de 4 octets en hexadécimale en un tableau de caractères" est la mauvaise question à poser - c'est déjà un "tableau de caractères". Ce que vous voulez dire, c'est que vous voulez obtenir une représentation textuelle dans la notation IP décimale à points standard. Le sujet a changé en conséquence. –

Répondre

9
char saddr[16]; 
sprintf(saddr, "%d.%d.%d.%d", (unsigned char)address[0], (unsigned char)address[1], (unsigned char)address[2], (unsigned char)address[3]); 

ou

char saddr[16]; 
unsigned char *addr = (unsigned char*)address; 

sprintf(saddr, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); 

ou, comme l'a souligné dreamlax:

char saddr[16]; 
sprintf(saddr, "%hhu.%hhu.%hhu.%hhu", address[0], address[1], address[2], address[3]); 
+0

'% hhu' serait un meilleur spécificateur pour chaque composant d'adresse, puisque c'est exactement ce que vous donnez' sprintf'. – dreamlax

+0

Votre distribution est erronée. Vous devez lancer la commande 'unsigned char *' ** avant ** déréférencer le pointeur, pas après. Le faire ensuite a un comportement défini par l'implémentation qui pourrait générer un signal ou se convertir de manière incorrecte (sur des systèmes non-deux-complémentaires). –

+0

Et bien sûr, il serait préférable d'utiliser simplement le bon type ('unsigned char [4]' ou 'uint8_t [4]') pour commencer. –

5

Une adresse IP est juste les octets individuels imprimés en tant que décimaux séparés par un.

printf("%d.%d.%d.%d",address[0],address[1],address[2],address[3]); 

Vous devriez probablement faire votre char address[4] un unsigned char address[4]

+0

Je n'ai pas besoin de l'imprimer cependant. J'ai besoin que l'adresse entière soit stockée dans un autre tableau char qui contient les caractères {1,2,8,., 1,7,1,., 1,0,., 2,8} – MBU

+0

Cela donne "-128" pour le premier caractère, à moins que vous ne changiez le type de tableau en 'unsigned char' comme recommandé. – sje397

+0

@MikeU: recherche la fonction qui imprime une chaîne dans une variable. De plus, les chaînes sont des tableaux char –

-1

aide% u serait encore mieux.

+0

Cela donne une erreur 'stack smashing detected', compilant avec gcc. – sje397

+0

% u ne devrait être utilisé que pour des données non signées - ce message signifie que le tampon sprintf a débordé, ce qui signifie probablement que vos types n'étaient pas d'accord. – 0xDEADBEEF

+0

Martin - pas mes types, mais les types utilisés dans la question. '% u' attend des valeurs' unsigned int'. – sje397