trabajar a nivel de bits
2 participantes
Página 1 de 1.
trabajar a nivel de bits
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!
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
Re: trabajar a nivel de bits
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.
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
Re: trabajar a nivel de bits
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!!
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
Re: trabajar a nivel de bits
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.
#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
Re: trabajar a nivel de bits
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!
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
Re: trabajar a nivel de bits
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.
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
Re: trabajar a nivel de bits
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!
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
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.