none
¿Cómo abrir este código y que me lo ejecute? RRS feed

  • Pregunta

  • Hola:

    Tengo este código de abajo, lo he abierto en modo consola y no va, viendo los ussing que tiene lo he hecho con Form1, lo he agregado referencia y no va.

    Este es el código que debo ejecutar, quiero de alguna forma ponerl en el Visual C# 2013 y que funcione, está claro que con copiar y pegar no me funciona.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    
    namespace SnesKit
    {
        public enum BankTypeEnum { Lo, Hi };
        public class RomDump
        {
            // Indica si la ROM tiene el smc header o no
            bool SmcHeader;
    
            // Indica la localización del header de SNES
            int HeaderLocation;
    
            // Array con los datos de la ROM
            public byte[] Data;
    
            // 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;
    
            // Esta funcion permite el analisis de ROMS de SNES con extensiones SMC y SFC
            public RomDump(byte[] rom)
            {
                this.Data = rom;
                // Comprobamos si existe el header smc
                if (this.Data.Length % 1024 == 512)
                    SmcHeader = true;
                else if (this.Data.Length % 1024 == 0)
                    SmcHeader = false;
                else
                    throw new Exception("Archivo de rom invalida.");
                this.HeaderLocation = 0x81C0;
    
                if (HeaderIsAt(0x07FC0)) // La Rom es LoROM
                {
                    this.BankType = BankTypeEnum.Lo;
                }
                else if (HeaderIsAt(0x0FFC0))
                {
                    this.BankType = BankTypeEnum.Hi;
                }
    
                // Leemos el Header
                ReadHeader();
    
            }
            // Función para comprobar si el header esta en la dirección correcta
            private bool HeaderIsAt(ushort addr)
            {
                this.HeaderLocation = addr;
                return VerifyChecksum();
            }
    
            // 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 VerifyChecksum()
            {
                // La rom tiene header smc
                if (SmcHeader)
                    this.HeaderLocation += 512;
    
                this.ChecksumCompliment = BitConverter.ToUInt16(this.Get(0x1C, 0x1D), 0);
                this.Checksum = BitConverter.ToUInt16(this.Get(0x1E, 0x1F), 0);
                ushort ver = (ushort)(this.Checksum ^ this.ChecksumCompliment);
                return (ver == 0xFFFF);
            }
    
            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);
            }
    
            private string GetROmB()
            {
                return String.Format("{0}", this.RomSize);
            }
            private byte[] Get(int from, int to)
            {
                return this.Data.Skip(this.HeaderLocation + from).Take(to - from + 1).ToArray();
            }
            private byte At(int addr)
            {
                return this.Data[this.HeaderLocation + addr];
            }
        }
    }
    

    Saludos.


    http://electronica-pic.blogspot.com

    • Cambiado Karen Malagón martes, 9 de junio de 2015 19:49 Windows Forms issue
    domingo, 7 de junio de 2015 22:55

Respuestas

  • Error    1    No se puede convertir implícitamente el tipo 'byte' en 'string'    C:\Users\Usuario\Documents\Visual Studio 2013\Projects\ROM_SNES\ROM_SNES\Form1.cs    30    40    ROM_SNES

    Perdón, RomSize es de tipo byte. hay que convertirlo en cadena

    textBox_RomSize.Text = VARIABLE.RomSize.ToString();

    En cuanto a lo que dices que el código de abajo que crees que no hace nada, te comento que si pones en blanco el textbox de la ruta del archivo o dicho archivo no existe vas a obtener una excepción


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Metaconta jueves, 11 de junio de 2015 4:30
    miércoles, 10 de junio de 2015 10:35

Todas las respuestas

  • hola

    no entiendo, que es eso de abierto en modo consola ?

    lo copias y pegas donde ? creas un archivo .cs y defines ese codigo alli dentro

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 7 de junio de 2015 23:04
  • Hola Metaconta al parece es un Clase creada en un proyecto windows forms, es por ello que tiene la referencia de Windows.Forms;

    Otra posible opción seria que sea una clase dentro de un ClassLibrary y este ClassLibrary tenga una referencia de Windows.Form.

    Tengo entendido que esa clase es usada en algun formulario del proyecto de windows Form.

    Pero por las lineas de código observadas veo que esta realizado en proyecto windows form, solo deberías de copiar el código y el using y verificar si tiene alguna dll o referencia que posiblemente estes pasando por alto.

    Espero haberte ayudado.


    domingo, 7 de junio de 2015 23:11
  • hola... Ese código que has puesto es únicamente una definición de una clase. Si pulsas botón derecho en cualquier parte del código seleccionas Organize usings/remove unused usings seguramente te eliminará la referencia a Windows.Forms. Para que tu código te "vaya", necesitas una clase que Implemente método Main(), para aplicaciones de consola.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 7 de junio de 2015 23:45
  • Hola:

    Lo que quiero es que ese código me funcione, sea modo consola o Form.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 7 de junio de 2015 23:58
  • crea un proyecto nuevo de consola. Agrega una clase nueva a tu proyecto y copia el código que has puesto. Verifica el namespace de tu proyecto y de este código que has puesto. En el método Main() instancia la clase SnesKit.RomDump romDump =SnesKit.RomDump();y la usas

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 8 de junio de 2015 0:03
  • hola

    pero donde estas ubicando ese codigo? lo pones dentro de un .cs

    si es asi elimina los using que no usas, osea las lineas

    using System.Windows.Forms;

    using System.ComponentModel;

    no definas using que no usas

    ----

    sino usa la opcion

    imagen

    del VS para remover using que no utilizas en la clase

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 8 de junio de 2015 0:29
  • Hola:

    Me he perdido.

    Creo un proyectonuevo que lo llamo SnesKit. No se si es adecuado poner ese mismo nombre.

    Se me crea este código.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SnesKit
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    }

    APor ahora te entendí hay que hacer esto primero. No estoy seguro. ¿Es así como dices?

    Esta parte.

    clase SnesKit.RomDump romDump =SnesKit.RomDump();

    Prefieros que me pongas el código completo, por ahor pezco.

    Saludos.


    http://electronica-pic.blogspot.com

    lunes, 8 de junio de 2015 0:31
  • el archivo Class1.cs renombralo a RomDump.cs. Es mas explicito. Luego tu código que pusiste en tu pregunta lo copias y lo,pegas en RomDump.cs (eliminando lo que te ha creado la plantilla al crear Nueva Clase). Luego en tu Main() de Program.cs que has mostrado instancias la clase y la usas... Tal vez no me explique bien

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    lunes, 8 de junio de 2015 0:36
  • Lo he hecho.

    Lo ejecuta. En cuanto al textBox1, no aparece nada. Aparentemente este programa no hace nada.

    Le puse un archivo.smc y nada.

    Supuestamente detecta cosas y debo ponerlo en el form principal. Detecta por ejemplo cuando el archivo tiene  cabecera, Precisamente hay datos aquí para mostrarlo en el form.

            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);
            }

    Por poner jemplo y muchos más.

    Saludos.


    http://electronica-pic.blogspot.com

    lunes, 8 de junio de 2015 1:07
  • >>APor ahora te entendí hay que hacer esto primero. No estoy seguro. ¿Es así como dices?

    si asi es correcto, en ese Class1.cs debes poner el codigo

    >>Esta parte. clase SnesKit.RomDump romDump =SnesKit.RomDump();

    pero esto donde lo defines ? porque alli estas usando (instanciando) la clase, no definiendola

    me pregunto leiste algo de programacion orientada a objetos ? porque crear he instanciar una clase es algo basico que veo estas confundiendo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 8 de junio de 2015 1:41
  • >>Lo ejecuta. En cuanto al textBox1, no aparece nada. Aparentemente este programa no hace nada.

    pero donde defines el textBox1 ?

    si pones un breakpoint en el metodo ReadHeader() puedes validar que pasa la ejecucion por alli y que parsea correctamente las posiciones que debe tomar del archivo ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 8 de junio de 2015 1:46
  • Hola:

    En muchos sitios para coger información debo usar textBox para cada cosa, ejjejejej. Por ahor sigo lo que me puso nuestro amigo, he comentado algo y he traducido las variables y más cosas en español.

    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];
            }
        }
    }

    Los BreakPoints tampoco hace nada. Ya que estamos. Quiero coger estos datos que precisamente es en este modelo.

    La cabecera mostrará mucha información en este form. Falta añadir más cosas para su lectura, por ahora está lo que me interesa.

    Información  a la hora de leer el archivo binario lo explica aquí y aquí.

    Descargar proyecto Alfa v0.1.

    Saludos.


    http://electronica-pic.blogspot.com



    • Editado Metaconta lunes, 8 de junio de 2015 7:33
    lunes, 8 de junio de 2015 5:44
  • Hola:

    Quiero leer este código y pasarlo todo a un textBox.

            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);
            }
    

    Supuestamente es algo así, como indica abajo.

            private void Leer_Header()
            {
    byte[] binaryData = //.... levantar el byte array desde lo estés leyendo.
     
             var romDump = new SnesKit.RomDump(binaryData);
             this.txtName.Text  = romDump.Name; 
             this.txtLayout.Text = romDump.Layout.ToString();
             this.txtCartridgeType.Text = romDump.CartridgeType.ToString();
             this.txtRomSize.Text = romDump.RomSize.ToString();
             this.txtRamSize.Text = romDump.RamSize.ToString();
             this.txtCountryCode.Text = romDump.CountryCode.ToString();
             this.txtVersionNumber.Text = romDump.VersionNumber.ToString();
            }

    De alguna manera o otra, quiero que sea capaz de leero.

    Supuestamente el código completo es este.

    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()
            {
                byte[] binaryData = //.... levantar el byte array desde lo estés leyendo.
     
             var romDump = new SnesKit.RomDump(binaryData);
             this.txtName.Text  = romDump.Name; 
             this.txtLayout.Text = romDump.Layout.ToString();
             this.txtCartridgeType.Text = romDump.CartridgeType.ToString();
             this.txtRomSize.Text = romDump.RomSize.ToString();
             this.txtRamSize.Text = romDump.RamSize.ToString();
             this.txtCountryCode.Text = romDump.CountryCode.ToString();
             this.txtVersionNumber.Text = romDump.VersionNumber.ToString();
    
                //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];
            }
        }
    }

    Me da errores y pongo algunos, precismaente en al parte del código Leer_Header():

    Error    8    'SnesKit.RomDump' no contiene una definición de 'txtCartridgeType' ni se encontró ningún método de extensión 'txtCartridgeType' que acepte un primer argumento de tipo 'SnesKit.RomDump' (¿falta una directiva de uso o una referencia de ensamblado?)    C:\Users\usuario\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    130    15    WindowsFormsApplication1

    Error    3    El nombre 'romDump' no existe en el contexto actual    C:\Users\Meta\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    127    14    WindowsFormsApplication1

    Error    2    El nombre 'var' no existe en el contexto actual    C:\Users\Meta\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    127    10    WindowsFormsApplication1

    Error    1    Se esperaba ;    C:\Users\Meta\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    127    14    WindowsFormsApplication1


    http://electronica-pic.blogspot.com

    martes, 9 de junio de 2015 21:58
  • Lo primero, resuelve el error numero 1 que es que te falta un ;. Mira la linea 127 de Form1.cs.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 9 de junio de 2015 22:03
  • Buenas:

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

    https://github.com/Zeokat/SNES-ROM-Header-Dumper-CSharp/blob/master/snes_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...

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

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

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

    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.

    ¿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.

            // 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. 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.

    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.


    http://electronica-pic.blogspot.com

    miércoles, 10 de junio de 2015 2:48
  • Hola:

    Haciendo prueabas para carar el archivo binario, me da estos errores. Este es el 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 ROM_SNES
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            { 
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(textBox_Nombre_de_archivo.Text.ToString()));
                    textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
                }
            }
        }
    }

    El error es este.

    Excepción no controlada del tipo 'System.ArgumentException' en mscorlib.dll

    Información adicional: No se puede dejar vacío el nombre de la ruta de acceso.

    ¿Alguna solución?

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 10 de junio de 2015 8:45
  • Buenas:

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

    https://github.com/Zeokat/SNES-ROM-Header-Dumper-CSharp/blob/master/snes_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...

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

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

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

    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.

    ¿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.

            // 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. 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.

    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.


    http://electronica-pic.blogspot.com

    ¿Qué problema tienes? Con usar tu clase para que se rellenen los datos al leer el archivo, luego para mostrar el contenido en los textbox harías

    txtRomsize.Text = objetoSNES.RomSize;


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 10 de junio de 2015 9:26

  • Excepción no controlada del tipo 'System.ArgumentException' en mscorlib.dll

    Información adicional: No se puede dejar vacío el nombre de la ruta de acceso.


    Debes validar que la ruta que le pasas a 

    File.ReadAllBytes(textBox_Nombre_de_archivo.Text.ToString())

     esté rellena y exista el archivo

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    	if (!string.IsNullOrWhiteSpace(textBox_Nombre_de_archivo.Text.ToString()) &&
    		File.Exists(textBox_Nombre_de_archivo.Text.ToString()))
    	{
    		SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(textBox_Nombre_de_archivo.Text.ToString()));
    		textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
    	}
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 10 de junio de 2015 9:31
  • Hola:

    Tu código de abajo no veo que haga algo. Hice esto de esta manera.

    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 ROM_SNES
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            { 
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                    textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
    
                    //textBox_RomSize.Text = VARIABLE.RomSize;
                }
            }
        }
    }
    

    No se si está bien. A parte que no me sale si pongo esta línea.

    textBox_RomSize.Text = VARIABLE.RomSize;

    Error    1    No se puede convertir implícitamente el tipo 'byte' en 'string'    C:\Users\Usuario\Documents\Visual Studio 2013\Projects\ROM_SNES\ROM_SNES\Form1.cs    30    40    ROM_SNES

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 10 de junio de 2015 10:31
  • Error    1    No se puede convertir implícitamente el tipo 'byte' en 'string'    C:\Users\Usuario\Documents\Visual Studio 2013\Projects\ROM_SNES\ROM_SNES\Form1.cs    30    40    ROM_SNES

    Perdón, RomSize es de tipo byte. hay que convertirlo en cadena

    textBox_RomSize.Text = VARIABLE.RomSize.ToString();

    En cuanto a lo que dices que el código de abajo que crees que no hace nada, te comento que si pones en blanco el textbox de la ruta del archivo o dicho archivo no existe vas a obtener una excepción


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Metaconta jueves, 11 de junio de 2015 4:30
    miércoles, 10 de junio de 2015 10:35

  • Auí hay una Web perfecta para convertir códigos.
    https://www.easycalculation.com/hex-converter.php

    O verlo directamenta la tabla ASCII.
    http://www.elcodigoascii.com.ar/codigo-americano-estandar-intercambio-informacion/codigo-ascii.gif

    El 12 que presenta es decimal, quiero se se vea hexadecimal, que es 0C. (En C# se presenta así 0x0C).

    Busqué aquí.
    https://msdn.microsoft.com/es-es/library/bb311038.aspx?f=255&MSPPError=-2147217396

    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 ROM_SNES
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            { 
     
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                    textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
     
                    textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
                }
            }
        }
    }


    Me sale la C. Quiero que salga 0C.

    Edito:

    Hice este 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 ROM_SNES
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            { 
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                    textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
    
                    textBox_Name.Text = VARIABLE.Name;
                    textBox_Layout.Text = string.Format("{0:X}", VARIABLE.Layout);
                    textBox_CartridgeType.Text = string.Format("{0:X}", VARIABLE.CartridgeType);
                    textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
                    textBox_RamSize.Text = string.Format("{0:X}", VARIABLE.RamSize);
                    textBox_CountryCode.Text = string.Format("{0:X}", VARIABLE.CountryCode);
                    textBox_LicenseCode.Text = string.Format("{0:X}", VARIABLE.LicenseCode);
                    textBox_VersionNumber.Text = string.Format("{0:X}", VARIABLE.VersionNumber);
                    textBox_BankType.Text = VARIABLE.BankType.ToString();
                }
            }
        }
    }
    

    Me salió este resultado. En los demás txtBox vacíos, no tengo la menor idea de como lograrlo, me machaqué las neuronas un poco por esta tontería.

    El Cuadro 3 Azul si me sale, estaba haciendo pruebas, los demás no me sale.

    Saludo.



    • Editado Metaconta miércoles, 10 de junio de 2015 12:00
    miércoles, 10 de junio de 2015 10:59
  • Hola de nuevo:

    Ya hice este código y funciona.

    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 ROM_SNES
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            { 
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    FileInfo Archivo = new FileInfo(openFileDialog1.FileName);
                    SnesKit.RomDump VARIABLE = new SnesKit.RomDump(File.ReadAllBytes(openFileDialog1.FileName.ToString()));
                    textBox_Nombre_ruta_archivo.Text = openFileDialog1.FileName.ToString(); // Muestra la ruta del archivo.
                    textBox_Name.Text = VARIABLE.Name;
                    textBox_Layout.Text = string.Format("{0:X}", VARIABLE.Layout);
                    textBox_CartridgeType.Text = string.Format("{0:X}", VARIABLE.CartridgeType);
                    textBox_RomSize.Text = string.Format("{0:X}", VARIABLE.RomSize);
                    textBox_RamSize.Text = string.Format("{0:X}", VARIABLE.RamSize);
                    textBox_CountryCode.Text = string.Format("{0:X}", VARIABLE.CountryCode);
                    textBox_LicenseCode.Text = string.Format("{0:X}", VARIABLE.LicenseCode);
                    textBox_VersionNumber.Text = string.Format("{0:X}", VARIABLE.VersionNumber);
                    textBox_BankType.Text = VARIABLE.BankType.ToString();
                    textBox_Checksum.Text = string.Format("{0:X}", VARIABLE.Checksum);
                    textBox_ChecksumCompliment.Text = string.Format("{0:X}", VARIABLE.ChecksumCompliment);
                    textBox_SmcHeader.Text = VARIABLE.SmcHeader ? "True" : "False";
                    textBox_HeaderLocation.Text = string.Format("{0:X}", VARIABLE.HeaderLocation);
                    textBox_MB.Text = string.Format("{0:N0}", (Archivo.Length / 1024f) / 1024f); // Resultado 4 MB.
                    textBox_KB.Text = string.Format("{0:N0}", (Archivo.Length / 1024f)); // 4.907 KB.
                    textBox_Bytes.Text = string.Format("{0:N0}", Archivo.Length); // 4.194.816 B o Bytes.
                    textBox_Mbit.Text = string.Format("{0:N0}", ((Archivo.Length / 1024f) / 1024f) * 8); // Mega bits.
                }
            }
        }
    }
    

    Había que poner variables en public para que me hiciera caso, el que no logro es el textbox addr, no se como poner esa variable en public.

    Muestro la imagen de abajo.

    1) Como puedes ver arriba, en el Cuadro 3 azul, en el textBox en MB pone 4. ¿Cómo hago que se vea el subfijo de esta manera?

    En vez de 4 MB que muestre 4.00 MB.

    2) En el Cuadro 4 amarillo, en el textBox "Nombre del archivo". Cuando abro un archivo en el botón "Arbrir archivo" en eltextBox "Ruta del archivo" se ve la ruta y el nombre del archivo. En el textBox "Nombre del archivo". ¿Cómo hago para que vea su nombre?

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 10 de junio de 2015 19:35