Pasar este código a Visual C#

Foro dedicado a la programación en todo tipo de sistemas clásicos.
REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 146
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Pasar este código a Visual C#

Mensajepor REHome » 09 Jun 2015, 11:00

Hola:

Aquí hay un código que me interesa, se trata de sacar información de un archivo binario, por ejemplo, una ROM de juegos de Super Nintendo, archivos .smc, binarios al fin y al cabo. Este es su enlace.

https://github.com/Zeokat/SNES-ROM-Header-Dumper-CSharp/blob/master/snes_dumper.cs

Lo he intentado y no hay manera, ajjajajaja. No me entero en programación del mundo .net, pero vamos a intentarlo.

Supuestamente creo un formulario con Visual C# Express 2013 o el que tengas. Pronto saldrá la versión 2015.

La parte del código que me interesa sacar información es este trozo de código.

Código: Seleccionar todo

        private void ReadHeader()
        {
            this.Name = Encoding.ASCII.GetString(this.Get(0x00, 0x14)); // 21 chars
            this.Layout = this.At(0x15);
            this.CartridgeType = this.At(0x16);
            this.RomSize = this.At(0x17);
            this.RamSize = this.At(0x18);
            this.CountryCode = this.At(0x19);
            this.LicenseCode = this.At(0x1A);
            this.VersionNumber = this.At(0x1B);
        }


Parece ser que ese código fue hecho a partir de estas web.
SNES header - ROM Hack City
SMC header - ROM Hack City

De esa información obtenida, quiero que aparezca en cada uno en sus textBox correspondientes, incluido el peso del archivo binario.

¿Una ayudita?

Saludos.

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1489
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 14 veces
Gracias recibidas: 244 veces

Re: Pasar este código a Visual C#

Mensajepor BlackHole » 09 Jun 2015, 12:16

Yo no tengo ni idea de programar aplicaciones visuales en Windows, y menos en .NET.

Aclarado eso, lo que tienes que ver en ese código de GitHub, es que tanto la función "Get" como la función "At" no son nativas, aparecen después como funciones privadas, que extraen datos desde la posición real en el fichero, añadiendo el desplazamiento que previamente se ha calculado más arriba, según si el fichero original proviene de un copiador que añadía cabecera de 512 bytes (como el Super Magicom y por evolución posterior, el Super Wild Card) o proviene de un copiador que no ponía cabeceras (como el Multi Game Hunter o el Game Doctor).

El documento de ROM Hack City al que enlazas lo deja más o menos claro, aunque también tiene sus gazapos, como que los juegos originales no usaban la información presente en esa zona. ¡La de juegos de SNES que yo tuve que desproteger en su día! Vaya si comprobaban el código de país para los bloqueos regionales y el checksum para evitar manipulaciones externas...

Dices, y cito, que "lo has intentado y no hay manera". Podrías empezar diciendo qué has intentado y qué resultados has obtenido. En el tema de formularios y presentación en pantalla con textbox y esas cosas no te puedo ayudar porque estoy igual de verde que tú, pero lo que sí tienes que tener muy claro es llegar a la posición correcta del archivo binario, antes de convertir la información allí presente en datos inteligibles hacia el usuario.

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 146
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Pasar este código a Visual C#

Mensajepor REHome » 09 Jun 2015, 16:32

Hola:

Algo he hecho por mi cuenta sin usar ese código, algo parecido quiero hacer com lo ha hecho este programa.
Imagen

Saludos.

-- Actualizado 10 Jun 2015, 04:03 --

Buenas:

Voy a empezar desde el principio. El código lo he sacado de esta Web.

https://github.com/Zeokat/SNES-ROM-Head ... _dumper.cs

El archivo se llama snes_dumper.cs.

Creo un proyecto nuevo. Se que lo expliqué pero haré lo mismo por si acaso no me haya expresado bien o no he entendido bien. Uso Visual C# Express 2013. Hay gente que me recomienda el VS Comunity, ni sabía su existencia, no se de que va ni ventajas que tiene y no se si es gratuito como el Express, esto es otra historia.

Archivo-->Nuevo Proyecto...
Imagen

A crear una clase nueva en, PROYECTO-->Agregar clase...
Imagen

Le pongo el nombre de la clase llamado snes_dumper.cs, como indica abajo, luego pulso el botón Agregar.
Imagen

Seañade la calse snes_dumper.cs como muestra abajo. El código generado a borrarlo.
Imagen

He copiado el código que descargué en la Web de origen dentro del archivo snes_dumper.cs en el formulario como puedes ver abajo.
Imagen

¿Qué es lo que quiero?

1) Con un botón leer el archivo *.smc, es una ROM, un archivo binario.
2) Lo que lea la clase snes_dumper.cs lo tiene que mostrar en sus textBox correspondiente en el Form1.

La mayoría de los datos que quiero visualizar en el TextBox son estas variables.

Código: Seleccionar todo

       // Los diferentes datos que obtenemos de la ROM
        public string Name;
        public byte Layout;
        public byte CartridgeType;
        public byte RomSize;
        public byte RamSize;
        public byte CountryCode;
        public byte LicenseCode;
        public byte VersionNumber;
        ushort Checksum;
        ushort ChecksumCompliment;
        public BankTypeEnum BankType;


Hay 11 variables en el primer Cuadro en verde. Esas 11 variables es lo que tengo que leer en el textBox. La lectura lo hace a la hora de pulsar un botón, seleccionar el archivo binario a leer y lo leído, lo muestra en el formulario. Les dejo el formulario hecho estilo colores y nombrado por Cuadros 1 al 4. El que me interesa mucho es el Cuadro 1 y el Cuadro 4 para cargar el archivo binario.
Imagen

Los nombres de cada textBox están identificado por el nombre de sus variables así no te perderás. Digamos que esto es una plantilla con la clase snes_dumper.cs sin hacer nada, solo a la espera de ser programado.

Les dejo aquí para descargar esta plantilla por llamarlo de alguna manera, bueno, lo llamaremos proyecto vacío.

Descarga

Espero ayuda para leer esta clase. En resumen, quiero leer las variables que indiqué arriba y lo muestre en el Formulario que he hecho arriba de colorines.

Saludos.

Avatar de Usuario
Kyp
Commodore 128
Commodore 128
Mensajes: 80
Registrado: 31 Dic 2013, 12:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: Vectrex
Gracias dadas: 11 veces
Gracias recibidas: 10 veces

Re: Pasar este código a Visual C#

Mensajepor Kyp » 10 Jun 2015, 12:20

En el diseñador, añade un "openFileDialog" desde el ToolBox (no se como será en español, yo tengo el Visual Studio en inglés), arrástralo a cualquier parte del formulario y te lo añadirá abajo, en una zona especial que aparecerá para objetos que no son botones, luego haz dobleclick sobre el botón de abrir archivo y sustituye el método creado automáticamente por éste:

Código: Seleccionar todo

      private void button1_Click(object sender, EventArgs e)
      {
         if(openFileDialog1.ShowDialog(this) == DialogResult.OK)
         {
            textBox1.Text = Path.GetDirectoryName(openFileDialog1.FileName);
            textBox2.Text = Path.GetFileName(openFileDialog1.FileName);

            SnesKit.RomDump romdump = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName));
            textBox_Name              .Text = romdump.Name;
            textBox_LicenseCode       .Text = romdump.LicenseCode.ToString();
            textBox_Layout            .Text = romdump.Layout.ToString();
            textBox_VersionNumber     .Text = romdump.VersionNumber.ToString();
            textBox_CartridgeType     .Text = romdump.CartridgeType.ToString();
            textBox_RamSize           .Text = romdump.RamSize.ToString();
            textBox_BankType          .Text = romdump.BankType.ToString();
            textBox_CountryCode       .Text = romdump.CountryCode.ToString();
            textBox_Tamaño_Archivo_MB .Text = string.Format("{0:0.0}MB", (float)romdump.Data.Length/(1024*1024));
         }
      }

No es todo lo que quieres pero es la información que se puede sacar tal cual está el código. Para el tema del checksum y la cabecera habría que hacer cambios en la clase RomDump.

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 146
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Pasar este código a Visual C#

Mensajepor REHome » 11 Jun 2015, 22:06

Hola:

Con tu idea me está funcionando las cosas.

Gracias.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados