Proyecto de Fin de Carrera
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

trabajar a nivel de bits

2 participantes

Ir abajo

trabajar a nivel de bits Empty trabajar a nivel de bits

Mensaje  luko Lun Abr 07, 2008 6:16 pm

Me estreno en el foro con esta dudilla...

Estoy teniendo problemas al crear un "paquete" de datos. Éste tiene una cabecera, y contenido (los datos en sí), y al final un checksum.
La cosa es que los datos, que son unsigned short, me piden que los almacene en complemento a dos. Y es ahí donde me atasco un poco.

Para más información para la aplicación estoy usando Visual C++. He visto por ahí algún método, pero no me queda del todo claro.

Saludos!

luko

Cantidad de envíos : 9
Fecha de inscripción : 01/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  vanja_ozegovic Jue Abr 17, 2008 7:41 pm

Buenas,

La verdad es que no lo he probado, pero que yo sepa, para hacer el complemento a 2, tienes que hacer el complemento a 1 y luego sumar un 1. En C, complemento a 1 se hace con el operador de negación ~ a nivel de bits.
También hay que destacar que el C, por motivos de eficiencia, ya almacena los datos en complemento a 2 por lo que no se si te servirá de algo hacer la conversión. Supongo que C++ lo hace de la misma forma.

NOTA: Cuando pruebes hacerlo en C por ejemplo, el formato de impresión tiene que especificarse con %u y no %d para el unsigned. Intentaré hacerlo en código y lo posteo.

vanja_ozegovic

Cantidad de envíos : 9
Edad : 38
Fecha de inscripción : 05/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  luko Jue Abr 17, 2008 10:41 pm

Muchas gracias!
Lo de que los enteros se guardaban en complemento a dos, no lo sabía. Y claro, me estaba poniendo a hacer "virguerías" con la clase bitset, pero eso de trabajar a nivel de bits con esta clase es un peñazo con conversiones de aquí para allá!

Según lo que me dices... me valdría con un simple ... sprintf(cadena, "%u", entero) ?

jejeje... me vas a matar, lo de pasar a complemento a dos era la punta del iceberg!
La cosa es enviarle datos a una máquina a través del puerto COM. Para ello me dan una estructura a seguir... Te pongo un ejemplo parecido, para que no resulte un peñazo de explicar.

Éste es el formato:

char nombre ------> 4 bytes
unsigned int edad ----------> 2 bytes
long loquesea -----> 4 bytes

La cosa es que la función que tengo definida para comunicarse por el puerto COM, lo que escribe es un vector de BYTE (unsigned char). Así que, según lo que me has dicho, podría valer con ésto?

BYTE trama;
// meto el nombre
char nombre[] ="Luk";
char aux[4];
sprintf( aux, "%s", Luk);
for(int i = 0; i < 4; i++)
trama[i] = aux[i];

// meto el entero
unsigned int edad(32);
char aux[2];
sprintf(aux, "%u", edad);

Y lo agrego igual a "trama", así con todos los campos....

¿Cómo lo ves?

Gracias y un saludo!!

luko

Cantidad de envíos : 9
Fecha de inscripción : 01/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  vanja_ozegovic Vie Abr 18, 2008 12:00 am

Pues en principio si. Yo he probado con este codigo y funciona:

#include
#include

int main() {
printf("Introduzca la edad\n");
scanf("%d", &edad);

printf("Complemento a dos %u\n", edad);
return 0;
}

Hay que tener en cuenta que los numeros positivos no se transforman (tienen el mismo valor) y los números negativos pues tal como hace el código.

El problema: Pues tu lo que usas es la edad con lo que siempre será positivo y no te hará falta transformar porque no lo hará. Es independiente de si es unsigned o short int puesto que lo hace bien para los dos.

Ahora bien, al pasarlo con sprintf no da el resultado correcto. Creo que deberias usar otra forma para pasar el resultado (a lo mejor bit a bit con rotacion izquierda o derecha --> operador >>).

Por cierto, como se trata de un tema interesante sin suficiente informacíon en la web, he contactado con Sr. Palomo y si me responde pues ya te lo postearé también.

vanja_ozegovic

Cantidad de envíos : 9
Edad : 38
Fecha de inscripción : 05/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  luko Vie Abr 18, 2008 7:59 pm

Gracias Vanja!

La verdad es que voy a intentar ahondar un poco más en el tema trabajando a nivel de bits. Y ojalá Palomo tenga alguna ocurrencia alucinante que haga que termine esto!!!
Es el problema de los proyectos del ROA, que son proyectos "raros" de los que no hay muchas fuentes de información.


Un saludo!

luko

Cantidad de envíos : 9
Fecha de inscripción : 01/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  vanja_ozegovic Miér Abr 23, 2008 10:45 pm

Saludos,

Acabo de leer el correo que me respondió Palomo y la verdad es que confirma mis dudas. Creo que en tu caso no tendría sentido realizar la conversión en complemento a dos puesto que la edad es un número siempre positivo. Esto es evidentemente el caso de que el ejemplo que pusiste es el que usas. Lo que quiero decir es que la transformación a complemento a dos solo tiene sentido para números negativos.

Te en cuenta que el complemento a dos sólo tiene sentido para números
negativos. Lo números sin signo se almacenan, normalmente, en binario
natural. (Palomo)

Por otro lado, cuando crees el vector de bytes a transmitir, no puedes hacerlo con un número entero dado, sino calculando el tamaño puesto que el almacenamiento que se asigna a los tipos básicos depende de la maquina concreta.

Por último en caso de que quieras realizar todavía la conversión, según Palomo, el libro recomendado es el que ellos escribieron sobre C estándar (Por fin C ISO). El tema a tratar está en las páginas 167-169. La recomendación es no usar el operador que yo mencionaba sino hacerlo como te dije a través de operadores de bits, jugando con desplazamientos y máscaras sobre los números sin signo.

Bueno espero que esto te haya aclarado algo. Si necesitas más ayuda pues avisas y si consigues algo, también.

vanja_ozegovic

Cantidad de envíos : 9
Edad : 38
Fecha de inscripción : 05/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  luko Miér Abr 23, 2008 11:27 pm

Muchas gracias !

Yo también me "temía" lo mismo, trabajar a nivel de bits es menos cómodo que con una función maravillosa que todo lo haga... jejejeje.

Voy a intentar avanzar sobre ésto, ya responderé por aquí con mis logros!

Gracias de nuevo!

luko

Cantidad de envíos : 9
Fecha de inscripción : 01/04/2008

Volver arriba Ir abajo

trabajar a nivel de bits Empty Re: trabajar a nivel de bits

Mensaje  Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.