 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 12 Dic, 2008 1:06 am Asunto: puntero a int |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 12 Dic, 2008 1:53 am Asunto: |
|
|
| 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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 12 Dic, 2008 8:42 am Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 12 Dic, 2008 4:23 pm Asunto: |
|
|
_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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 12 Dic, 2008 7:27 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 12 Dic, 2008 7:42 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 12 Dic, 2008 7:50 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 12 Dic, 2008 10:51 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|