FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Leer DWORDs invertidos
Hola amigos, cuando se lee un int de un archivo binario se pasa al int invertido, osea que si en el archivo vemos 21 33 55 44 y leo esa memoria a un int se pasa como 0x44553321. La cuestion es que quiero leerlo como 0x21335544 y no tengo ni idea de como hacer eso. ¿alguien sabria ayudarme?
|
#2
|
||||
|
||||
Cita:
Saludos |
#3
|
||||
|
||||
Se me ocurre algo así:
Código PHP:
Otra opción que se me ocurre es leer del fichero 4 bytes como char[4] y luego convertir con algún Cast esos 4 bytes en un entero ¿Con eso obtendría el valor invertido? ¿Cómo se haría ese Cast? |
#4
|
||||
|
||||
No entiendo que tengas que usar cambios a cadenas de caracteres, ¿Te interesan los datos en caracteres o numéricos?
Saludos. |
#5
|
||||
|
||||
A ver si me explico, este archivo es leido por la PS3 y es donde se guarda la partida de un juego en concreto. La empresa que ha creado el juego lo ha protegido con un checksum que por lo visto se llama DWADD que no es mas que ir sumando DWORDs del archivo uno detras de otro en un rango especifico y el valor obtenido es el checksum el cual lo guarda en otra parte del archivo para saber si ha sido modificado. El problema me lo encontré con que mi checksum no tenia nada que ver con el correcto y despues de muchas vueltas alguien me dijo que el modo en que se lee la memoria depende de la arquitectura del procesador y me dije ¿y si la ps3 lo hace al reves?
O sea, si miras en binario el archivo verias algo como 11 22 33 44 55 66 77 88 Si lees dos dwords obtendrias: 0x44332211 0x88776655 Al menos en mi pc es asi. Pues bien, la suma al final si que era invirtiendolo con lo que quedarian como: 0x11223344 0x55667788 Lo he conseguido con esta pequeña funcion que me he creado para esto: Código PHP:
De todos modos soy todo oidos. |
#6
|
||||
|
||||
Si, esa puede ser una forma de hacerlo pero en la unión que usas, la parte de cadena deben ser 4 uchar y no 5 que son 32 bits, el tamaño de int.
Otra forma es usar funciones que ya tenemos disponibles como htonl de la librería Winsock2 y que está disañada para compatibilizar los sistemas en red (Little Endian a Big Endian) Saludos. Última edición por escafandra fecha: 23-11-2017 a las 13:52:43. |
#7
|
||||
|
||||
¿Podrías poner algún ejemplo de uso de htonl?
No lo había escuchado nunca pero la verdad es que para algo tan trivial tener que añadir toda una librería... Una duda que tengo es si podría hacerlo de otra manera que sería leer, con la misma unión pero usando la cadena, directamente con FileRead cogiendo como cadena de 4 bytes y al leer el int que hay en la unión ya estaría invertido o tendría que invertirlo igualmente. |
#8
|
||||
|
||||
Cita:
Código PHP:
Cita:
Saludos. |
#9
|
||||
|
||||
Ok gracias.
|
#10
|
||||
|
||||
Digo yo que leer byte a byte y usar operadores de bit funcionará, ¿no?
A ver si me acuerdo de cómo era la cosa esta: [edito] He releido la pregunta: Código:
int i; long Valor; FILE *ElArchivo; for (i = 0, Valor = 0; i < 4; ++i) Valor = (Valor << 8) | (getc (ElArchivo) & 0x000000FF); |
#11
|
||||
|
||||
Cita:
Saludos. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Leer CSV | Willo | Varios | 4 | 04-04-2017 20:06:21 |
Leer XML | chinchan | C++ Builder | 3 | 08-11-2012 23:45:24 |
Leer XML | cmm07 | Varios | 4 | 02-02-2010 14:36:05 |
Leer *.res | dmagui | Varios | 5 | 04-10-2005 22:40:32 |
Leer usb | trex2000 | Varios | 1 | 14-03-2005 12:51:41 |
|