Foros del Web » Programación para mayores de 30 ;) » .NET »

Pasar este código a Visual C#

Estas en el tema de Pasar este código a Visual C# en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 08/06/2015, 18:48
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 17 años
Puntos: 8
Pasar este código a Visual C#

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-H...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:
        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.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #2 (permalink)  
Antiguo 08/06/2015, 19:14
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Pasar este código a Visual C#

Cita:
Iniciado por REHome Ver Mensaje
Supuestamente creo un formulario con Visual C# Express 2013
Yo te recomendaría que dejes de usar VS Express y pases a VS Community. Las versiones Express son acotadas y no todas te permiten hacer todos los tipos de proyecto, y esto puede resultar bastante confuso.

Cita:
Iniciado por REHome Ver Mensaje
De esa información obtenida, quiero que aparezca en cada uno en sus textBox correspondientes, incluido el peso del archivo binario.
La forma rápida de hacerlo es manualmente pasar los valores de los campos de una instancia de esa clase a sus respectivos controles:

Código XAML:
Ver original
  1. <Window x:Class="MiProjecto.MiVentana"
  2.        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  4.     <StackPanel>
  5.         <TextBox x:Name="txtName"/>
  6.         <TextBox x:Name="txtLayout"/>
  7.         <TextBox x:Name="CartridgeType"/>
  8.         <TextBox x:Name="RomSize"/>
  9.         <TextBox x:Name="RamSize"/>
  10.         <TextBox x:Name="CountryCode"/>
  11.         <TextBox x:Name="VersionNumber"/>
  12.     </StackPanel>
  13. </Window>

Código C#:
Ver original
  1. public class MiVentana: Window
  2. {
  3.     public MiVentana()
  4.     {
  5.         InitializeComponent();
  6.         MostrarDatos();
  7.     }
  8.  
  9.     public void MostarDatos()
  10.     {
  11.          byte[] binaryData = //.... levantar el byte array desde lo estés leyendo.
  12.  
  13.          var romDump = new SnesKit.RomDump(binaryData);
  14.          this.txtName.Text  = romDump.Name;
  15.          this.txtLayout.Text = romDump.Layout.ToString();
  16.          this.txtCartridgeType.Text = romDump.CartridgeType.ToString();
  17.          this.txtRomSize.Text = romDump.RomSize.ToString();
  18.          this.txtRamSize.Text = romDump.RamSize.ToString();
  19.          this.txtCountryCode.Text = romDump.CountryCode.ToString();
  20.          this.txtVersionNumber.Text = romDump.VersionNumber.ToString();
  21.     }
  22. }
  #3 (permalink)  
Antiguo 09/06/2015, 03:29
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 17 años
Puntos: 8
Respuesta: Pasar este código a Visual C#

Buenas:

A parte de leerlo como has indicado. ¿Cómo pongo el código completo tal como está? No lo consigo, a parte necesito que me lea el archivo binaro. Lo intenté con este ejemplo de base.

Cuando lo consiga, hago tu ejemplo de los textbox. Por cierto, pasé hasta las variables en español para entendernos mejor.

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO; // No olvidar

namespace WindowsFormsApplication1
{
    using System;
    using System.Windows.Forms;
    using SnesKit;
    using System.IO;

    public partial class Form1 : Form
    {
        RomDump dump;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                dump = new RomDump(File.ReadAllBytes(@"archivo.smc"));
                textBox1.Text = dump.Nombre;
            }
            catch (Exception)
            {
                MessageBox.Show("No encuentra el archivo.", "error", MessageBoxButtons.OK);
            }
        }
    }
}

namespace SnesKit
{
    using System;
    using System.Linq;
    using System.Text;

    public enum BankTypeEnum { Lo, Hi };
    public class RomDump
    {
        // Indica si la ROM tiene el smc header o no. (header = cabecera).
        bool SmcHeader;

        // Indica la localización del header de SNES.
        int Localizacion_Header;

        // Array o arreglo o vector con los datos de la ROM.
        public byte[] Datos;

        // Los diferentes datos que obtenemos de la ROM.
        public string Nombre;
        public byte Diseño_ROM;
        public byte Tipo_Cartucho;
        public byte Tamaño_ROM;
        public byte Tamaño_RAM;
        public byte Código_País;
        public byte Código_Licencia;
        public byte Número_Versión;
        ushort Checksum;
        ushort Checksum_Cumplido;
        public BankTypeEnum Tipo_banco;

        // Esta funcion permite el análisis de ROMS de SNES con extensiones SMC y SFC.
        public RomDump(byte[] rom)
        {
            this.Datos = rom;
            // Comprobamos si existe el header smc.
            if (this.Datos.Length % 1024 == 512) // Si el resto es 512.
                SmcHeader = true; // Tiene Header o cabecera.
            else if (this.Datos.Length % 1024 == 0) // Si el resto es 0.
                SmcHeader = false; // No tiene Header o cabecera.
            else
                throw new Exception("Archivo de rom inválida.");
            this.Localizacion_Header = 0x81C0; // Dirección del offset de la ROM.

            if (Header_está_en(0x07FC0)) // La ROM es LoROM.
            {
                this.Tipo_banco = BankTypeEnum.Lo;
            }
            else if (Header_está_en(0x0FFC0)) // La ROM en HiROM.
            {
                this.Tipo_banco = BankTypeEnum.Hi;
            }

            // Leemos el Header.
            Leer_Header();

        }
        // Función para comprobar si el header esta en la dirección correcta
        private bool Header_está_en(ushort Dirección)
        {
            this.Localizacion_Header = Dirección;
            return Verificar_Checksum();
        }

        // Offset 0x07FC0 in a headerless LoROM image (LoROM rom sin smc header).
        // Offset 0x0FFC0 in a headerless HiROM image (HiROM rom sin smc header).
        // Verifica el checksum.
        private bool Verificar_Checksum()
        {
            // La rom tiene header smc.
            if (SmcHeader)
                this.Localizacion_Header += 512; // Añade en la localización de la cabecera o Header + 512 bytes.

            this.Checksum_Cumplido = BitConverter.ToUInt16(this.Obtener(0x1C, 0x1D), 0);
            this.Checksum = BitConverter.ToUInt16(this.Obtener(0x1E, 0x1F), 0);
            ushort Ver = (ushort)(this.Checksum ^ this.Checksum_Cumplido);
            return (Ver == 0xFFFF);
        }

        private void Leer_Header()
        {
            this.Nombre = Encoding.ASCII.GetString(this.Obtener(0x00, 0x14)); // 21 chars.
            this.Diseño_ROM = this.En(0x15);
            this.Tipo_Cartucho = this.En(0x16);
            this.Tamaño_ROM = this.En(0x17);
            this.Tamaño_RAM = this.En(0x18);
            this.Código_País = this.En(0x19);
            this.Código_Licencia = this.En(0x1A);
            this.Número_Versión = this.En(0x1B);
        }

        private string Obtener_ROM_B()
        {
            return String.Format("{0}", this.Tamaño_ROM); // Obtiene el tamaño del archivo ROM.
        }
        private byte[] Obtener(int desde, int a)
        {
            return this.Datos.Skip(this.Localizacion_Header + desde).Take(a - desde + 1).ToArray();
        }
        private byte En(int Dirección)
        {
            return this.Datos[this.Localizacion_Header + Dirección];
        }
    }
}


Gracias.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #4 (permalink)  
Antiguo 09/06/2015, 16:00
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 17 años
Puntos: 8
Respuesta: Pasar este código a Visual C#

Hola de nuevo.
Sigo con las pescas.

Por si acaso hice esto.






La clase Class1.cs lo he llamado al final ROM.cs

Aquí dejo un ejemplo del proyecto completo en Visual C# Express 2013.

Descargar

Saludos.

PD: Voy echar un ojo de cerca el VS comunity haber que ventajas tiene frente al express, espero que sea gratuito como el express y que no sea prueba de 30 días para lueg pagar.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar

Etiquetas: c#
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:45.