FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
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. |
|
|
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 |
|