miércoles, 13 de abril de 2011

Aprendiendo C: Satuxconv (III)

Ya tenemos claro los pasos que, de momento, tiene que hacer nuestro programa. A saber:
  • Abrir el fichero en modo sólo lectura.
  • Acceder al byte número 32 y leer 16 bytes.
  • Mostrar, de forma continua, el contenido de esos bytes.
  • Repetir el proceso con el resto de campos que queremos mostrar.
En el manual que comentaba en la primera entrada de esta serie, podemos encontrar todo lo necesario para poder hacer esto sin más problemas.

Código:

/* Satuxconv */

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int i; /* contador */
int j; /* contador 2 */
int buffer; /* Buffer de datos */
FILE* fichero; /*Fichero a abrir */

void mostrar (int pos, int maximo)
{
for (i=1; i<=maximo; i++)
{
j = (pos + i);
fseek(fichero, j, SEEK_SET);
fread(&buffer, 1, 1, fichero);
printf("%c", (char)buffer);
}
}

main (int argc, char *argv[])
{
int fecha[8]; /*Almacena la fecha*/
int regiona[3]; /*Region del juego*/

/*Comprobar parámetros y abrir fichero*/
printf("\nSatuxconv\n");
if (argc < 2)
{
printf("Uso: satuxconv imagen.bin");
printf("\nActualmente se soportan imagenes BIN\n\n");
exit(0);
}

fichero=fopen(argv[1], "rb");

printf("\nDatos de la imagen\n");
printf("------------------\n\n");

/*Obteniendo el titulo*/
printf("Título: ");
mostrar(111,27);

/*Obteniendo el desarrollador*/
printf("\nDesarrollador: ");
mostrar(31, 16);

/*Obteniendo el producto*/
printf("\nProducto: ");
mostrar(47,7);

/*Obteniendo la version*/
printf("\nVersión: ");
mostrar(57,6);

/*Obteniendo la fecha*/
printf("\nFecha: ");
for (i=1; i<=8; i++)
{
j = (63 + i);
fseek(fichero, j, SEEK_SET);
fread(&fecha[i], 1, 1, fichero);
}
printf("%c%c/%c%c/%c%c%c%c\n", (char)fecha[7],(char)fecha[8], (char)fecha[5], (char)fecha[6], (char)fecha[1], (char)fecha[2], (char)fecha[3], (char)fecha[4]);

/*Obteniendo regiones*/
for (i=1; i<=3; i++)
{
j= 79 + i;
fseek(fichero, j, SEEK_SET);
fread(&regiona[i], 1, 1, fichero);
}

/*Mostrar regiones*/
printf("\nRegión(es) del juego:\n");
for (i=1; i<=3; i++)
{
printf(" %c", (char)regiona[i]);
if ((char)regiona[i] == 'T')
printf(" - (Asia - NTSC)\n");
if ((char)regiona[i] == 'E')
printf(" - (Europa)\n");
if ((char)regiona[i] == 'U')
printf(" - (América del Norte)\n");
if ((char)regiona[i] == 'J')
printf(" - (Japón)\n");
if ((char)regiona[i] == 'B')
printf(" - (Centro/SudAmérica NTSC)\n");
if ((char)regiona[i] == 'K')
printf(" - (Corea)\n");
if ((char)regiona[i] == 'A')
printf(" - (Asia Este PAL)\n");
if ((char)regiona[i] == 'L')
printf(" - (Centro/SudAmérica PAL)\n");
}

/*Cerrar fichero*/
fclose(fichero);
}
El editor de Blogspot es un poco caprichoso y ha alineado a la izquierda todo el código, dejándolo sin tabuladores, y algún posible error, lo siento !

Se ha creado una función llamada "mostrar" que se encarga de leer los bytes en cada uno de los pasos. Gracias a esto la cantidad de código se reduce considerablemente.

Compilamos el código fuente y ejecutamos:

./satuxconv Castlevania.bin

Satuxconv 0.05

Datos de la imagen
------------------

Título: DRACULA-X
Desarrollador: SEGA TP T-95
Producto: T-9527G
Versión: V1.400
Fecha: 27/04/1998

Región(es) del juego:
E - (Europa)

Funciona ! En la siguiente entrada pasaremos al modo escritura y cambiaremos la región del juego por la que nosotros queramos.

1 comentario: