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.