Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

puntero a int

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: puntero a int Responder citando

Hola, tengo un pequeño problema atravesado y ya no puedo con él.
necesito leer los 'bytes' de un int tal cual están en memoria para calcular un CRC..
Veamos un ejemplo:
int numero=0x040000FF que en memoria está 0xFF000004

para calcular el CRC, tengo que pasar un char simple de cada byte, por ello he probado

char temp[10]
memcpy(&temp,&numero,sizeof(numero))

pero temp contiene esto: 0x040000FF
He probado con un int *p=&numero pero tengo el mismo problema, es decir, al enviar el valor del puntero *p+n sigue el orden de los chars, primero el 0x04, 0x00 ......

¿Es posible copiar un int en en char sin alterar la posición de la memoria?
o ¿Es posible mandar cada byte en orden correcto de un int a modo char?

La función donde tengo que enviar a calcular cada uno de los bytes es algo asi: CRC( int crc, char c), y a c es donde tengo que enviar cada byte del int

Gracias por vuestra ayuda.

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bosoft escribió:
char temp[10]
memcpy(&temp,&numero,sizeof(numero))

pero temp contiene esto: 0x040000FF

Has probado a mostrar el contenido ?
Código:
ShowMessage(String().sprintf("b1=%02X, b2=%02X, b3=%02X, b4=%02X",
    (BYTE)temp[0], (BYTE)temp[1], (BYTE)temp[2], (BYTE)temp[3]));

Esto muestra: "b1=FF, b2=00, b3=00, b4=04"

Entiendo que ese orden es el que quieres no ? por tanto creo que lo que estas haciendo funciona correctamente.

Otra forma de hacerlo:
Código:
ShowMessage(String().sprintf("b1=%02X, b2=%02X, b3=%02X, b4=%02X",
    numero & 255, numero >> 8 & 255, numero >> 16 & 255, numero >> 24 & 255));

Y otra bastante más sencilla usando "union":
Código:
union { int numero; char b[4]; };
numero = 0x040000FF;

ShowMessage(String().sprintf("b1=%02X, b2=%02X, b3=%02X, b4=%02X",
    (BYTE)b[0], (BYTE)b[1], (BYTE)b[2], (BYTE)b[3]));
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo, lo de la unión no se me había ocurrido. lo probaré.

En cuanto a mostrar el contenido, así es, lo muestra correcto, pero si lo haces en modo debug, es decir, vas paso a paso lo que le pasas a la función, lo hace mal, de ahí el problema.

Lo de los ands, lo he pensado, pero se complica mucho el código, puesto que en realidad se trata de una estructura de unos 600 bytes en los que hay varios chars los cuales no debe cambiar

Gracias

Saludos, Bosoft.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo: no puedo con esto.
El problema está en la lectura. Me explico mejor.
Los datos están en un archivo. Este es el primer valor de la estructura y en este caso en el archivo hay 0x040000FF. Se trata de un int, pero tengo que calcular el crc de la memoria, que en este caso está almacenada asi 0xFF000004.
Si le asignamos al int el valor directo desde código, todo lo que me indicas es correcto, pero cuando lo lee del archivo la cosa no va. He intentado leer un char[4] en vez del int, y me lee 040000FF.
Con la unión pasa lo mismo, en memoria el int esta como debe, pero el char está al revés.

No se por donde darle, puesto que tendré que convertir cada campo de la estructura a mano, para intercambiar los datos de ABCD a DCBA que es como los guardan en memoria los intel (creo)
He hecho otra prueba, haciendo una estructura así:
struct{ char a[2]; int valor;}
Le copio el valor leido del int a valor y pensaba en leer los bytes desde a[2] (posición del primer byte del int). Pues no se porqué los datos no se corresponden y me da: 0x10000400 como si le faltara un byte o mas por algún sitio.

Gracias, seguiré intentándolo.

Saludos, Bospft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bosoft No creo que hagas nada mal. Ciertamente en la memoria los Bytes están al revés. Todo depende del casting que realices al visualizarlos.

Código:
int numero = 0x040000FF;
BYTE temp[4];
memcpy(&temp,&numero,sizeof(numero));

// Temp    contiene FF, 00, 00, 04
// Temp[0] contiene FF
// numero  contiene 040000FF
// *(char*)&numero contiene FF, 00, 00, 04
// *(int*)&Temp    contiene 040000FF


No se como está definida tu función CRC pero dentro de un bucle debería recibir correctamente los Bytes.

Código:
for(int n=0; n<4; n++){
   ...CRC(...., Temp[n]);  // debe recibir bien los valores tal y como están en memoria
   .....
   .....
}



Espero haberte entendido bien.
Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

gracias escafandra por contestar, pero ya he explicado en el post anterior que si asignas el int en el código todo va bien, el problema viene cuando lo cargas de un archivo. en ese caso la salida de temp es 040000FF

Al final he tenido que cambiar los bits a mano, campo por campo de la estructura, con unos 80 campos y pasar a normal los int, short y longs y dejar como estan los chars

Gracias

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno, me alegro que lo tengas conseguido.
No debería ocurrir al leer desde un archivo, al menos si lo lees entero en un array Byte* Buffer y en modo binario. En este caso Buffer contendría la memoria tal cual y int numero = (int*)Buffer contendría lo que debe contener:

*Buffer contiene FF, 00, 00, 04
*(int*)Buffer contiene 040000FF

Este modo de proceder, leyendo archivos y realizando casting, lo he realizado muchas veces y nunca he tenido problemas.

De todas formas lo solucionaste.....

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por tu ayuda.
El archivo contiene 040000FF. Si lo lee un char sigue conteniendo lo mismo y si lo paso a int contiene FF000004. De ahí mi lío. Me ha tocado cambiar byte a byte los 4 de un int (o los 2 si es short).

Ahora tengo que ver los long, que no tengo idea de lo que ocupan al igual que los float y double, que de todo hay en esa estructura.

Gracias por todo

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.