Convertir de u_int32_t a int y al reves

Iniciado por Stakewinner00, 22 Enero 2014, 15:42 PM

0 Miembros y 3 Visitantes están viendo este tema.

Stakewinner00

Buenas, hoy estaba programando una cosa con sockets y me encontre que tenia que pasar de u_int32_t a int y al revés. Vi cosas por internet pero no aclaran mucho. Alguien sabe como se puede pasar de u_int32_t a int no con código sino manualmente (con una calculadora en mano)? xD

Saludos y gracias

amchacon

#1
Un u_int32_t es un unsigned int en la inmensa mayoría de las maquinas actuales.

Pasar de u_int32_t a int sería dejarlo tal como esta, pasar de int a u_int32_t sería hacerle el valor absoluto.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ivancea96

Además, siempre puedes hacer un union.

Stakewinner00

Gracias por las respuestas, pero no me funciona nada xD.

Estaba editando el code del ejemplo de https://repolinux.wordpress.com/2011/09/18/libnet-1-1-tutorial/#example-6 para hacer spoof de la ip de origen, funciona pero no con la ip que quiero. Supongo que algo estaba haciendo mal.

ahora fijándome en todo el code veo que quizás no sea 32 bits sino 8

Código (cpp) [Seleccionar]
libnet_autobuild_arp (ARPOP_REQUEST,\
src_mac_addr->ether_addr_octet,\
[b](u_int8_t*)(&src_ip_addr), mac_zero_addr,[/b]\
(u_int8_t*)(&target_ip_addr), l) == -1)


bueno, a ver si logro resolver el problema.

cpu2

Bueno, no entiendo esas definiciones de C, pero si estas trabajando con direcciones ipv4 estas son de 32 bits vamos que son un int, ejemplo: 0xffffffffff seria 255.255.255.255.
Las Mac serian 6 bytes, si no me confundo.

Y para ponerlas al reves o invertirlas puedes usar bswap en ASM en linea, o hacer algo en C. No se si eso responde tu pregunta.

Un saludo.

ivancea96

Código (cpp) [Seleccionar]
union{
    int a;
    uint32_t b;
}n;

n.a = 666;
cout << n.b;

Stakewinner00

ivancea96, ya lo probe y tras estar rato probando me estoy dando cuenta de que lo que falla no es la transformación a unsigned de 32 sino luego con el (u_int8_t*)(&src_ip_addr), mac_zero_addr, de 8 bits. Por ejemplo la dirección "2080483526" me devuelve que la ip es 192.168.1.124 y la dirección "2080483526+1" me devuelve que es 26.121.117.141 no 192.168.1.125

ivancea96

Pon el code de como lo transformas, a ver

Enviado desde mi ST21i mediante Tapatalk

cpu2

Creo que estas incrementando mal.

Porque no pones las direcciones en hexadecimal. 192.168.1.124 = 0x7c01a8c0, tendrias que incremental 0x7c. "2080483526" en teoria tendria que devolver 198.168.1.124.

Un saludo.

Stakewinner00

hoy encontre como solucionarlo mientras estaba en clase cpu2 en efecto, así también funciona.

El problema era que yo lo hacia directamente y antes de hacerlo debería dividir las ips por octetos,
por ejemplo la ip 192.168.1.129 se tendría que convertir a binario (es como yo lo hice) y sería 11000000.10101000.00000001.10000001 entonces paso el "10000001000000011010100011000000" a decimal unsigned de 32 bits que es "2164369600" y cuando lo paso al socket ya lo lee como debería (192.168.1.129)
gracias a todos por su ayuda ;)