ayuda paso de byte* a char*

Iniciado por Kaxperday, 26 Junio 2015, 19:42 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Código (cpp) [Seleccionar]
if (SendARP(destino, origen, MacAddr, &PhyAddrLen) == NO_ERROR)
{
if (PhyAddrLen)
{
*mac = (char*)&MacAddr;
/*BYTE *bMacAddr = (BYTE*)&MacAddr;
*(mac) = (char*)bMacAddr;
for (int i = 0; i < (int)PhyAddrLen; i++)
{
//printf("%x", bMacAddr[i]);
//*(mac[i]) = (char)bMacAddr[i];
}*/
return true;
}
}


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

*mac = (char*)&MacAddr;

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

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Pon el error al intentar esa conversión.

crack81

#2
Mira este codigo espero te sirva

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{

    char **pDobleOriginal=(char**)malloc(sizeof(char*)*20);
    unsigned long long int mac=123456789123;//12 valoress no se de cuanto sea la mac

    char buffer[20];
    sprintf(buffer,"%llu",mac);//convertimos el long long a char
    *pDobleOriginal=buffer;//copiamos la direccion

    printf("%s",*pDobleOriginal);//lo mostramos

    //aqui liberamos la memoria
    //.
    //.
    //.
    getchar();
    return 0;
}

Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Kaxperday

Hola gracias por las respuestas, el programa compilaba con éxito, os muestro lo que tengo y la salida:

Código (cpp) [Seleccionar]
char buffer[20];
sprintf(buffer, "%llu", MacAddr);//convertimos el long long a char
*mac = buffer;//copiamos la direccion

printf("%s\n", *mac);//lo mostramos

static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
static short which;
u_char *p;

p = (u_char *)&MacAddr;
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
_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]);
printf("%s", output[which]);
*mac = output[which];
system("pause");
/*printf("%s", (char*)&MacAddr);
*mac = (char*)&MacAddr;
BYTE *bMacAddr = (BYTE*)&MacAddr;
(mac) = (char*)bMacAddr;
for (int i = 0; i < (int)PhyAddrLen; i++)
{
printf("%x", bMacAddr[i]);
*(mac[i]) = (char)bMacAddr[i];
}*/


Citar8434662936278192
6071175415229

No obtengo nada, ahora estoy mirando la funcion iptos.

Saludos, sigo en ello.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Cita de: Kaxperday en 26 Junio 2015, 19:42 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?

Kaxperday

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 (cpp) [Seleccionar]
/* From tcptraceroute, convert a numeric IP address to a string */
#define IPTOSBUFFERS    12
char *iptos(u_long in)
{
   static char output[IPTOSBUFFERS][3*4+3+1];
   static short which;
   u_char *p;

   p = (u_char *)&in;
   which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
   _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
   return output[which];
}]



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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

BYTE es unsigned char. Con (char*) ha de bastar.

Kaxperday

Eso pensé pero no sé porque no funcionó:

Código (cpp) [Seleccionar]
BYTE *bMacAddr = (BYTE*)&MacAddr;
*(mac) = (char*)bMacAddr;
printf("%s\n", *(mac));


La salida es:

<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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

#8
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

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

Kaxperday

#9
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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.