Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 26 Junio 2015, 19:42 pm



Título: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 19:42 pm
Código
  1. if (SendARP(destino, origen, MacAddr, &PhyAddrLen) == NO_ERROR)
  2. {
  3. if (PhyAddrLen)
  4. {
  5. *mac = (char*)&MacAddr;
  6. /*BYTE *bMacAddr = (BYTE*)&MacAddr;
  7. *(mac) = (char*)bMacAddr;
  8. for (int i = 0; i < (int)PhyAddrLen; i++)
  9. {
  10. //printf("%x", bMacAddr[i]);
  11. //*(mac[i]) = (char)bMacAddr[i];
  12. }*/
  13. return true;
  14. }
  15. }

MacAddr es un long que contiene la direccion mac, y necesito esa direccion mac en char*, mac es un char** que recibe de argumento.

Código:
*mac = (char*)&MacAddr;

No funciona, ¿que puedo hacer para el cambio?.

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 20:34 pm
Pon el error al intentar esa conversión.


Título: Re: ayuda paso de byte* a char*
Publicado por: crack81 en 26 Junio 2015, 21:01 pm
Mira este codigo espero te sirva

Código
  1. #include <stdio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.  
  8.    char **pDobleOriginal=(char**)malloc(sizeof(char*)*20);
  9.    unsigned long long int mac=123456789123;//12 valoress no se de cuanto sea la mac
  10.  
  11.    char buffer[20];
  12.    sprintf(buffer,"%llu",mac);//convertimos el long long a char
  13.    *pDobleOriginal=buffer;//copiamos la direccion
  14.  
  15.    printf("%s",*pDobleOriginal);//lo mostramos
  16.  
  17.    //aqui liberamos la memoria
  18.    //.
  19.    //.
  20.    //.
  21.    getchar();
  22.    return 0;
  23. }
  24.  
  25.  


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 21:27 pm
Hola gracias por las respuestas, el programa compilaba con éxito, os muestro lo que tengo y la salida:

Código
  1. char buffer[20];
  2. sprintf(buffer, "%llu", MacAddr);//convertimos el long long a char
  3. *mac = buffer;//copiamos la direccion
  4.  
  5. printf("%s\n", *mac);//lo mostramos
  6.  
  7. static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
  8. static short which;
  9. u_char *p;
  10.  
  11. p = (u_char *)&MacAddr;
  12. which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
  13. _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]), "%d%d%d%d%d%d", p[0], p[1], p[2], p[3], p[4], p[5]);
  14. printf("%s", output[which]);
  15. *mac = output[which];
  16. system("pause");
  17. /*printf("%s", (char*)&MacAddr);
  18. *mac = (char*)&MacAddr;
  19. BYTE *bMacAddr = (BYTE*)&MacAddr;
  20. (mac) = (char*)bMacAddr;
  21. for (int i = 0; i < (int)PhyAddrLen; i++)
  22. {
  23. printf("%x", bMacAddr[i]);
  24. *(mac[i]) = (char)bMacAddr[i];
  25. }*/

Citar
8434662936278192
6071175415229

No obtengo nada, ahora estoy mirando la funcion iptos.

Saludos, sigo en ello.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 22:14 pm
No funciona, ¿que puedo hacer para el cambio?.

Si dices que no funciona pero compila, ¿cual era entonces el problema?

¿Qué es "which", y dónde lo inicializas?


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 22:21 pm
Línea 8, es de un código que saqué de esta función de la winpcap, aún no se que hace exactamente pero creo que ahí está la clave para hacer la conversión:

Código
  1. /* From tcptraceroute, convert a numeric IP address to a string */
  2. #define IPTOSBUFFERS    12
  3. char *iptos(u_long in)
  4. {
  5.    static char output[IPTOSBUFFERS][3*4+3+1];
  6.    static short which;
  7.    u_char *p;
  8.  
  9.    p = (u_char *)&in;
  10.    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
  11.    _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  12.    return output[which];
  13. }]


Pero tampoco funciona, ¿que puedo hacer?, dejando de lado errores (que no sale ninguno), ¿no se puede pasar de Byte* a Char* de alguna manera?, esa es la pregunta de este hilo, y el código que he subido un intento de implementación fallido, si seguimos buscando errores en él no llegaremos a ninguna parte.

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 22:24 pm
BYTE es unsigned char. Con (char*) ha de bastar.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 22:40 pm
Eso pensé pero no sé porque no funcionó:

Código
  1. BYTE *bMacAddr = (BYTE*)&MacAddr;
  2. *(mac) = (char*)bMacAddr;
  3. printf("%s\n", *(mac));

La salida es:

Código:
<G◄6ÿ↔╠╠╠╠╠╠╠╠╠╠☻☻☻☻WinSock 2.0

Paso MacAddr que es U_LONG[2] a una cadena de bytes, que se almacena en bMacAddr, luegoesa cadena de Bytes trato de convertirla a una cadena Char*, pero al mostrar la salida sale basura, notar que al mostrar los bytes de bMacAddr en un for, la salida es correcta, mostrando la Mac.

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 22:45 pm
No es basura. La cadena son los bytes que componen la MAC. Está en binario.
Tendrás que hacer un for para imprimir por pantalla uno a uno. (int)bMacAddr[ x ], o (int)(*mac)[ x ].

EDITO: En la documentación hay un ejemplo donde utiliza el for: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366358%28v=vs.85%29.aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366358%28v=vs.85%29.aspx)

No olvides mirar la documentación de las funciones. Aprobecha que MSDN documenta casi todo, si no todo.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 23:12 pm
Evidentemente ya busqué documentación incluyendo en MSDN.

Incluso ese mismo link, que para nada resuelve la duda, puesto que lo que hace es mostrar los bytes de la MAC usando un for, ya dije anteriormente que eso lo hacía sin problemas, y que el problema y duda por la que creé el hilo es porque quiero pasar de U_LONG a char* o string, no quiero mostrar Bytes por pantalla.

Dudo que la basura contenga los bytes de la MAC, puesto que "WinSock 2.0" no creo que tenga mucho que ver en ello.

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 23:17 pm
Dudo que la basura contenga los bytes de la MAC, puesto que "WinSock 2.0" no creo que tenga mucho que ver en ello.

printf() lee hasta un un byte nulo.bMacAddr no tiene byte nulo, así que sigue leyendo en memoria hasta un byte nulo.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 26 Junio 2015, 23:19 pm
Pero imprimir ints por pantalla no me hará conseguir la cadena char*.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 26 Junio 2015, 23:20 pm
En ese caso, utiliza sprintf().


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 27 Junio 2015, 02:35 am
Imposible:

Código
  1. BYTE *bMacAddr = (BYTE*)&MacAddr;
  2. for (int i = 0; i < (int)PhyAddrLen; i++)
  3. printf("%x", bMacAddr[i]);
  4. //*(mac) = (char*)bMacAddr;
  5. //printf("\n%s\n", (int)*(mac));
  6.  
  7. //const int n = sprintf(NULL, 0, "%lu", MacAddr);
  8. char buf[30];
  9. sprintf(buf, "\n%s", MacAddr);
  10. printf("\n%s\n", buf);

Ya lo probé antes y tampoco funciona, no hay manera he buscado ningún código funciona, al final lo acabaré pasando a u_char* y que lo **.

Edito: Produce error en el sprintf, "stack around the variable buff was corrupted".

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 27 Junio 2015, 02:38 am
MacAddr no. Tendrás que interpretar como enteros cada uno de los bytes de MacAddr.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 27 Junio 2015, 02:42 am
Código
  1. BYTE *bMacAddr = (BYTE*)&MacAddr;
  2. //for (int i = 0; i < (int)PhyAddrLen; i++)
  3. // printf("%x", bMacAddr[i]);
  4. //*(mac) = (char*)bMacAddr;
  5. //printf("\n%s\n", (int)*(mac));
  6. char buf[30];
  7. char ok[40]="";
  8.  
  9.  
  10. for (int i = 0; i < (int)PhyAddrLen; i++)
  11. printf("%c", (char)(int)bMacAddr[i]);
  12.  
  13. printf("\n");
  14. for (int i = 0; i < (int)PhyAddrLen; i++)
  15. {
  16. sprintf(buf, "%c", (int)bMacAddr[i]);
  17. printf("%c", buf);
  18. strcat(ok, buf);
  19. }
  20.  
  21. //sprintf(buf, "%s", MacAddr);
  22. printf("\n%s\n", ok);

No hay manera. 3 intentos 3 veces muestra basura.

Edito: Acabo de probar con _itoa y tampoco funciona, no hay manera.

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 27 Junio 2015, 02:57 am
Código:
printf("%c", (char)(int)bMacAddr[i]);
para qué ese (char)? Estás haciendo 2 conversiones, una de ellas no sirve de nada.

Prueba con
Código
  1. printf("%i", (int)bMacAddr[i]);


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 27 Junio 2015, 02:59 am
Nada:

Código
  1. BYTE *bMacAddr = (BYTE*)&MacAddr;
  2. for (int i = 0; i < (int)PhyAddrLen; i++)
  3. {
  4. printf("%i", (int)bMacAddr[i]);
  5. }

Salida:

Código:
6071175415229

Lejos de la cadena, mostrando enteros no obtendré un char*. Y para meterlo en sprintf..

Código
  1. for (int i = 0; i < (int)PhyAddrLen; i++)
  2. {
  3. printf("%i", (int)bMacAddr[i]);
  4. sprintf(buf, "%c", (int)bMacAddr[i]);
  5. printf("%c", buf[0]);
  6. }

Probaré otros métodos.

Gracias de todas formas.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 27 Junio 2015, 03:03 am
Esos son 6 números sin espacios. ¿No es la MAC que buscas?

Citar
60:71:175:41:52:29
Claramente, en decimal.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 27 Junio 2015, 03:07 am
Con espacios:

Código:
60 71 17 54 152 29

La Mac empezaba por 3C. Así hemos pasado los 6 bloques hexadecimales de la Mac a enteros. Si ahora lo que buscabas era pasarlos a chars no creo que funcione.

Esto sí muestra la Mac, pero no obtengo la cadena, no se como llegar a ella:

Código:
BYTE *bMacAddr = (BYTE*)&MacAddr;
for (int i = 0; i < (int)PhyAddrLen; i++)
printf("%x", bMacAddr[i]);

Saludos.


Título: Re: ayuda paso de byte* a char*
Publicado por: ivancea96 en 27 Junio 2015, 03:09 am
Como bien he dicho, esa MAC está en decimal...

¿Cuanto es 3C en decimal? Echa cuentas.


Título: Re: ayuda paso de byte* a char*
Publicado por: Kaxperday en 27 Junio 2015, 03:22 am
Bien, no sabría que estaba en decimal. Estoy codeando a ver si lo consigo de una vez.

Edito: ¡Por finnnn!, ya puedo irme a dormir contento. He aquí la JODIDA solución:

Código
  1. BYTE *bMacAddr = (BYTE*)&MacAddr;
  2. string res;
  3. stringstream ss;
  4. for (int i = 0; i < PhyAddrLen; i++)
  5. {
  6. ss << hex << (int)bMacAddr[i];
  7. res += ss.str();
  8. ss.str("");
  9. }
  10. *mac = _strdup(res.c_str());

Gracias ivancea96 por la ayuda. It works like a charm.

Saludos.