Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#5011
Lo que debes hacer para corregirlo es simplemente evitar castear un string VACÍO a esa variable Double, eso es lo que estás haciendo en alguna parte del código, así que comprueba los métodos que se llaman al iniciar tu app;
esto lo puedes controlar haciendo un chequeo al string con la función 'String.IsNullOrEmpty' o también 'String.IsNullOrWhiteSpace', o la función Enumerable.All o Enumerable.Any para evaluar una condición en los caracteres, o haciendo uso de la función 'Double.TryParse'.

Una combinación de todo:
Código (vbnet) [Seleccionar]

Dim num As Double
Dim str As String = ""

If String.IsNullOrEmpty(str) Then
   MessageBox.Show("La variable 'str' está vacía.")

ElseIf Not str.All(Function(c As Char) Char.IsNumber(c)) Then
   MessageBox.Show("La variable 'str' contiene caracteres no numéricos.")

ElseIf Not Double.TryParse(str, num) Then
   MessageBox.Show("La variable 'str' tiene un formato incorrecto.")

End If

MessageBox.Show("Nuevo valor: " & num)


Notas:
· La función 'Double.TryParse' intentará convertir la cadena de 'String' a tipo 'Double', devolviendo 'False' si la conversión ha fallado, o 'True' si la conversión ha tenido éxito.

· Si la conversión falla, el valor que se le asigna a la variable referenciada de tipo 'Double' será '0',
 si la conversión tiene éxito, obviamente el valor de la variable referenciada pasa a ser el valor que se ha convertido.

Saludos!
#5012
El tema ha sido movido a .NET.

Esto es VisualBasic.Net, no VisualBasic.

http://foro.elhacker.net/index.php?topic=436790.0
#5013
Mi manejo en C# no es muy bueno.

Puedes declarar el delegado:
Código (csharp) [Seleccionar]
internal delegate void UpdateVisualizacionMatriculaDelegate(string texto);

private void updateVisualizacionMatricula()
{
if (this.InvokeRequired) {
this.Invoke(new UpdateVisualizacionMatriculaDelegate(updateVisualizacionMatricula), texto);

} else {
lb_visualizacionMatricula.Text = texto;
int x = groupBoxVisualizacion.Width + label29.Width;
int w = lb_visualizacionMatricula.Width;
lb_visualizacionMatricula.Left = x / 2 - w / 2;
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


O también puedes usar el delegado Action para evitar la declaración de delegados adicionales en el código

Código (csharp) [Seleccionar]
this.Invoke(new Action<string>(updateVisualizacionMatricula), texto)
#5014
Cita de: Meta en 11 Junio 2015, 09:55 AM¿Qué opinas?

No quiero parecer arrogante, pero opino que no deberías manejar algo que no entiendes ...y encima haciendo copy/pastes.

Solo has tenido una comprensión incorrecta de las palabras que pone en esa documentación. El tamaño de la memoria de solo lectura (ROM) difiere de la memoria RAM, busca las definiciones de ambas para comprender. La wikipedia está para algo.

Primero deberías aprender lo que te falta por aprender del lenguaje, y de los conceptos que necesites aprender para llevar a cabo esa tarea (aunque yo tampoco soy ningún erudito en el entendimiento de las especificaciones del formato de los cartuchos ROM de SNES ni de la lectura y escritura de offsets), y luego ya, cuando te veas más capaz, te pones a hacer un lector de cabeceras para "X" formato.




Dicho esto, no todo iba a ser malo, he actualizado y mejorado el código fuente que publiqué en la página anterior para añadirle toda la información que faltaba (y más), gracias a las especificaciones que encontré en esta página:
http://softpixel.com/~cwright/sianse/docs/Snesrom.txt
y a esta aplicación para comprobar los resultados de mis modificaciones:
http://www.zophar.net/utilities/snesaud/snes-explorer.html

Ahora el código está mucho mejor, y con algunas funcionalidades de escritura más, aunque sigue faltando algún que otro detalle del que me cuesta encontrar documentación.

Aunque no lo vayas a usar, de todas maneras lo comparto en este hilo por si a otra persona le viene bien esta ayuda en VB.Net:

Código fuente:
http://pastebin.com/JMUEdWrK

Ejemplo de uso para la lectura:
Código (vbnet) [Seleccionar]
Dim romDump As New SnesRom("C:\ROM.smc")
' Or...
' Dim romDump As New SnesRom(File.ReadAllBytes("C:\ROM.smc"))

Dim sb As New StringBuilder
With sb
   .AppendLine(String.Format("Name..................: {0}", romDump.Name))
   .AppendLine(String.Format("Bank Type.............: {0}", romDump.BankType.ToString))
   .AppendLine(String.Format("Cartridge Type........: {0}", romDump.CartridgeType.ToString.ToUpper.Replace("_", "/")))
   .AppendLine(String.Format("Checksum..............: {0}", String.Format("0x{0}", Convert.ToString(CInt(romDump.Checksum), toBase:=16).ToUpper)))
   .AppendLine(String.Format("Checksum Complement...: {0}", String.Format("0x{0}", Convert.ToString(CInt(romDump.ChecksumComplement), toBase:=16).ToUpper)))
   .AppendLine(String.Format("Country Code..........: {0}", romDump.Country.Code.ToString))
   .AppendLine(String.Format("Country Name..........: {0}", romDump.Country.Name))
   .AppendLine(String.Format("Country Region........: {0}", romDump.Country.Region.ToString.ToUpper))
   .AppendLine(String.Format("Header Type (SMC).....: {0}", romDump.HeaderType.ToString))
   .AppendLine(String.Format("Layout................: {0}", romDump.Layout.ToString))
   .AppendLine(String.Format("License Code/Name.....: {0}", romDump.LicenseCode.ToString))
   .AppendLine(String.Format("ROM Size..............: {0} MBits", romDump.RomSize.ToString.Substring(1, romDump.RomSize.ToString.LastIndexOf("M") - 2)).Replace("_or_", "/"))
   .AppendLine(String.Format("RAM Size..............: {0} KBits", romDump.RamSize.ToString.Substring(1, romDump.RamSize.ToString.LastIndexOf("K") - 2)))
   .AppendLine(String.Format("Version Number........: 1.{0}", romDump.Version.ToString))
End With

Clipboard.SetText(sb.ToString) : MessageBox.Show(sb.ToString)


Resultado de ejecución de la lectura:
Name..................: SUPER MARIOWORLD
Bank Type.............: LoRom
Cartridge Type........: ROM/SRAM
Checksum..............: 0xA0DA
Checksum Complement...: 0x5F25
Country Code..........: 1
Country Name..........: United States
Country Region........: NTSC
Header Type (SMC).....: Headered
Layout................: 32
License Code/Name.....: Nintendo
ROM Size..............: 8 MBits
RAM Size..............: 16 KBits
Version Number........: 1.0


Ejemplo de uso para la escritura:
Código (vbnet) [Seleccionar]
Dim romDump As New SnesRom("C:\ROM.smc")
' Or...
' Dim romDump As New SnesRom(File.ReadAllBytes("C:\ROM.smc"))

With romDump
   .Name = "Elektrocitos"
   .Version = 1
   .Country = New SnesRom.CountryData(countryCode:=0) ' Japan.
   .LicenseCode = SnesRom.LicenseCodeEnum.Taito
   .RomSize = SnesRom.ROMSizeEnum._4_Mbits
   .RamSize = SnesRom.SRAMSizeEnum._256_Kbits
   .Save("C:\Elektron.smc", replace:=True)
End With


Saludos!
#5015
Dudas Generales / Re: facebook
11 Junio 2015, 13:16 PM
Cita de: samgalicia en 11 Junio 2015, 11:28 AMDesde ayer me llegan mensajes agresivos e insultantes a mi facebook

Pues no utilices Facebook, o bloquea a esa persona, fin del problema.

Cita de: samgalicia en 11 Junio 2015, 11:28 AM¿Hay alguna manera de levantarle la ip?

En este foro no, las preguntas sobre hacking no ético están prohibidas, lee las normas antes de publicar.

Saludos!
#5016
Mi primer mensaje no lo encuentro ya que he tenido varias cuentas y no me acuerdo de los nombres de usuario más antiguos, pero este es el mensaje más antiguo que encontré, data del 2009, cuando necesitaba pillar l'internéh del vecino y no tenía ni idea de cómo funcionaba la suite del Aircrack ...ni Linux:

Cita de: http://foro.elhacker.net/wireless_en_linux/necesito_ayuda_modo_monitor_con_chip_rt2500-t252435.0.html;msg1220027#msg1220027hola, he leido que el chipset ralink RT2500 no funciona en modo monitor ni en windows ni en linux, yo he probado con el cd live linux "Backtrack 4" y al usar el comando para ponerl mi tarjeta en modo monitor...parece que va bien, no me da error ni nada, y digamoslo asi en la "descripcion" o "informacion" del proceso pone correctamente que mi tarjeta está en modo monitor... pero entonces está bien? funciona en modo monitor? o el airodump no se entera de ná? xD gracias...

Que tiempos aquellos tan traviesos con el BackTrack... xD.

Saludos!
#5017
Cita de: ChindasvintoG en  9 Junio 2015, 22:49 PMEl enlace de Descarga de Mediafire está caído, podrías subirlo de nuevo?

Claro, ya está :).

Me he tomado un tiempo en subirlo por que tenía que corregir un bug (bug inofensivo, pweo me daba pereza).

Nueva versión 1.3, disponible en el enlace de descarga del tema principal.

Saludos!
#5018
Cita de: Meta en 10 Junio 2015, 21:38 PM

1)¿Cómo hago que se vea el subfijo de esta manera?
En vez de 4 MB que muestre 4.00 MB.

Debes usar la extensión ToString para convertir el valor numérico (repito, numérico, no String) a String, dándole el formato númerico al string, donde debes usar un formato que añada una precisión de 2 decimales.

Código (vbnet) [Seleccionar]
4.ToString("formato específico")

Es muy sencillo lo que quieres hacer, lee aquí para conocer la sintaxis del formato numérico, no te costará nada encontrar los caracteres que debes para el formato que necesitas darle:
Custom Numeric Format Strings - MSDN




Cita de: Meta en 10 Junio 2015, 21:38 PM2) 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?

Lee los métodos de la Class System.IO.Path, tiene un método para devolver el nombre de archivo de una ruta de archivo. Esto tampoco tiene pérdida.
Path Methods (System.IO) - MSDN

PD: De todas formas no creo que te costase nada buscar en Google "C# get filename" antes de preguntarlo... seguro que saldran miles de resultados por que es muy básico.

Saludos!
#5019
Cita de: Meta en 10 Junio 2015, 20:08 PMhe intentado traducirloa C# y me dice:

El motor/librería NRefactory que utilizan practicamente todos los traductores, es bastante estricto con los saltos de linea en ciertas partes, los cuales si que están permitidos en la IDE.

Debes escribir el bracket despues del keyword From.

Es decir, de esto:
Citar
Código (vbnet,1,2) [Seleccionar]
       Private ReadOnly countryDict As New Dictionary(Of Integer, String) From
           {
               {0, "Japan"},
               {1, "United States"},
               {2, "Unknown"},
               {3, "Unknown"},
               {4, "Unknown"},
               {5, "Unknown"},
               {6, "Unknown"},
               {7, "Unknown"},
               {8, "Spain"},
               {9, "Unknown"},
               {10, "Unknown"},
               {11, "Unknown"},
               {12, "Unknown"},
               {13, "Unknown"}
           }

A esto otro:
Código (vbnet,1) [Seleccionar]
       Private ReadOnly countryDict As New Dictionary(Of Integer, String) From {
               {0, "Japan"},
               {1, "United States"},
               {2, "Unknown"},
               {3, "Unknown"},
               {4, "Unknown"},
               {5, "Unknown"},
               {6, "Unknown"},
               {7, "Unknown"},
               {8, "Spain"},
               {9, "Unknown"},
               {10, "Unknown"},
               {11, "Unknown"},
               {12, "Unknown"},
               {13, "Unknown"}
           }





Cita de: Meta en 10 Junio 2015, 20:08 PMMuy pero que muy, muy, muy y muy buen trabajo.

Gracias. Alguien debería donarme unos eurillos a mi paypal :silbar:.

Saludos!
#5020
Te voy a hacer un regalito :P ...es cosa tuya traducirlo a C#, o compilar el código en una dll para no tener que traducir.

La SNES siempre me ha fascinado, bueno, tengo cierta melancolía y bastantes roms por ahí perdidas xD, en fin, me ha interesado el tema, he cogido la Class que publicaste al principio del tema, y la he extendido para mejorarla en varios aspectos, añadiendo mayor y mejor documentación, así cómo nuevas funcionalidades.




Cosas a tener en cuenta:

1. Me ha sido imposible descifrar los 13 códigos de paises que se pueden usar en una ROM de SNES, no encuentro información sobre esto en ningún lugar, solo encontré información parcial en la que se dice que '0' equivale a Japón, '1' a U.S., y bajo mis propias conclusiones '8' debe ser España.
Si alguien conoce esta información al completo, que me lo haga saber, gracias.

2. No he testeado mi Class con cientos de ROMs para comprobar que todo funciona cómo debería funcionar a las mil maravillas en todas las circunstancias posibles, pero supongo que si, ya que me he basado en las especificaciones de la cabecera de SNES, las cuales ya estaban implementados en la Class original de donde saqué la idea.
Si alguien encuentra algún error, que me lo comunique, gracias.




A continuación publico el código fuente, y abajo del todo unos ejemplos de lectura y escritura:

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro.
'            Based on this 3rd party project:
'            https://github.com/Zeokat/SNES-ROM-Header-Dumper-CSharp/blob/master/snes_dumper.cs
' Modified : 10-June-2015
' ***********************************************************************
' <copyright file="SnesRom.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Usage Examples "

' CONTENIDO OMITIDO...

#End Region

#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System.IO
Imports System.Text

#End Region

Public NotInheritable Class SnesRom

#Region " Properties "

   ''' <summary>
   ''' Gets the raw byte-data of the ROM file.
   ''' </summary>
   ''' <value>The raw byte-data of the ROM file.</value>
   Public ReadOnly Property RawData As Byte()
       Get
           Return Me.rawDataB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The raw byte-data of the ROM file.
   ''' </summary>
   Private ReadOnly rawDataB As Byte()

   ''' <summary>
   ''' Gets The ROM header type.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SMC_header</remarks>
   ''' <value>The ROM header type.</value>
   Public ReadOnly Property HeaderType As HeaderTypeEnum
       Get
           Return Me.headerTypeB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The ROM header type.
   ''' </summary>
   Private headerTypeB As HeaderTypeEnum

   ''' <summary>
   ''' Gets the SNES header address location.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The SNES header address location.</value>
   Private ReadOnly Property HeaderLocation As Integer
       Get
           Return Me.headerLocationB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The SNES header address location.
   ''' </summary>
   Private headerLocationB As Integer = 33216

   ''' <summary>
   ''' Gets or sets the name of the ROM, typically in ASCII.
   ''' The name buffer consists in 21 characters.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The name of the ROM.</value>
   Public Property Name As String
       Get
           Return Me.nameB
       End Get
       Set(ByVal value As String)
           Me.SetName(value)
           Me.nameB = value
       End Set
   End Property
   ''' <summary>
   ''' (backing field) The name of the ROM.
   ''' </summary>
   Private nameB As String

   ''' <summary>
   ''' Gets the ROM layout.
   ''' The SNES ROM layout describes how the ROM banks appear in a ROM image and in the SNES address space.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_ROM_layout</remarks>
   ''' <value>The ROM layout.</value>
   Public ReadOnly Property Layout As Byte
       Get
           Return Me.layoutB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The ROM layout.
   ''' </summary>
   Private layoutB As Byte

   ''' <summary>
   ''' Gets the bank type.
   ''' An image contains only LoROM banks or only HiROM banks, not both.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_ROM_layout</remarks>
   ''' <value>The bank type.</value>
   Public ReadOnly Property BankType As BankTypeEnum
       Get
           Return Me.bankTypeB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The bank type.
   ''' </summary>
   Private bankTypeB As BankTypeEnum

   ''' <summary>
   ''' Gets the cartrifge type, it can be a ROM only, or a ROM with save-RAM.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The cartridge type.</value>
   Public ReadOnly Property CartridgeType As CartridgeTypeEnum
       Get
           Return Me.cartridgeTypeB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The cartrifge type.
   ''' </summary>
   Private cartridgeTypeB As CartridgeTypeEnum

   ''' <summary>
   ''' Gets the ROM size byte.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The ROM size byte.</value>
   Public ReadOnly Property RomSize As Byte
       Get
           Return Me.romSizeB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The ROM size byte.
   ''' </summary>
   Private romSizeB As Byte

   ''' <summary>
   ''' Gets the RAM size byte.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The RAM size byte.</value>
   Public ReadOnly Property RamSize As Byte
       Get
           Return Me.ramSizeB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The ROM size byte.
   ''' </summary>
   Private ramSizeB As Byte

   ''' <summary>
   ''' Gets or sets the country data.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The country data.</value>
   Public Property Country As CountryData
       Get
           Return New CountryData(Me.CountryCode)
       End Get
       Set(ByVal value As CountryData)
           Me.SetByte(Me.startAddressCountryCode, value.Code)
           Me.CountryCode = value.Code
       End Set
   End Property

   ''' <summary>
   ''' The country code.
   ''' </summary>
   Private Property CountryCode As Byte

   ''' <summary>
   ''' Gets or sets the license code.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The license code.</value>
   Public Property LicenseCode As Byte
       Get
           Return Me.licenseCodeB
       End Get
       Set(ByVal value As Byte)
           Me.SetByte(Me.startAddressLicenseCode, value)
           Me.licenseCodeB = value
       End Set
   End Property
   ''' <summary>
   ''' (backing field) The license code.
   ''' </summary>
   Private licenseCodeB As Byte

   ''' <summary>
   ''' Gets or sets the version number.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The version number.</value>
   Public Property VersionNumber As Byte
       Get
           Return Me.versionNumberB
       End Get
       Set(ByVal value As Byte)
           Me.SetByte(Me.startAddressVersionNumber, value)
           Me.versionNumberB = value
       End Set
   End Property
   ''' <summary>
   ''' (backing field) The version number.
   ''' </summary>
   Private versionNumberB As Byte

   ''' <summary>
   ''' Gets the checksum compliment.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The checksum compliment.</value>
   Public ReadOnly Property ChecksumCompliment As UShort
       Get
           Return Me.checksumComplimentB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The checksum compliment.
   ''' </summary>
   Private checksumComplimentB As UShort

   ''' <summary>
   ''' Gets the checksum.
   ''' </summary>
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' <value>The checksum.</value>
   Public ReadOnly Property Checksum As UShort
       Get
           Return Me.checksumB
       End Get
   End Property
   ''' <summary>
   ''' (backing field) The checksum.
   ''' </summary>
   Private checksumB As UShort

#End Region

#Region " Header Addresses "

   ' ********************************************************************************************************************
   ' NOTE:
   ' The reason for the variables that are commented-out is just because are unused, but could be helpful in the future.
   ' ********************************************************************************************************************

   ' ''' <summary>
   ' ''' The start address of a Lo-ROM header.
   ' ''' </summary>
   'Private ReadOnly loRomHeaderAddress As UShort = 32704

   ' ''' <summary>
   ' ''' The start address of a Hi-ROM header.
   ' ''' </summary>
   'Private ReadOnly hiRomHeaderAddress As UShort = 65472

   ''' <summary>
   ''' The start address of the ROM name.
   ''' </summary>
   Private ReadOnly startAddressName As Integer = 0

   ''' <summary>
   ''' The end address of the ROM name.
   ''' </summary>
   Private ReadOnly endAddressName As Integer = 20

   ''' <summary>
   ''' The start address of the ROM layout.
   ''' </summary>
   Private ReadOnly startAddressLayout As Integer = 21

   ' ''' <summary>
   ' ''' The end address of the ROM layout.
   ' ''' </summary>
   'Private ReadOnly endAddressLayout As Integer = 21

   ''' <summary>
   ''' The start address of the ROM cartridge type.
   ''' </summary>
   Private ReadOnly startAddressCartridgeType As Integer = 22

   ' ''' <summary>
   ' ''' The end address of the ROM cartridge type.
   ' ''' </summary>
   'Private ReadOnly endAddressCartridgeType As Integer = 22

   ''' <summary>
   ''' The start address of the ROM size (rom).
   ''' </summary>
   Private ReadOnly startAddressRomSize As Integer = 23

   ' ''' <summary>
   ' ''' The end address of the ROM size (rom).
   ' ''' </summary>
   'Private ReadOnly endAddressRomSize As Integer = 23

   ''' <summary>
   ''' The start address of the ROM size (ram).
   ''' </summary>
   Private ReadOnly startAddressRamSize As Integer = 24

   ' ''' <summary>
   ' ''' The end address of the ROM size (ram).
   ' ''' </summary>
   'Private ReadOnly endAddressRamSize As Integer = 24

   ''' <summary>
   ''' The start address of the ROM country code.
   ''' </summary>
   Private ReadOnly startAddressCountryCode As Integer = 25

   ' ''' <summary>
   ' ''' The end address of the ROM country code.
   ' ''' </summary>
   'Private ReadOnly endAddressCountryCode As Integer = 25

   ''' <summary>
   ''' The start address of the ROM license code.
   ''' </summary>
   Private ReadOnly startAddressLicenseCode As Integer = 26

   ' ''' <summary>
   ' ''' The end address of the ROM license code.
   ' ''' </summary>
   'Private ReadOnly endAddressLicenseCode As Integer = 26

   ''' <summary>
   ''' The start address of the ROM Version Number.
   ''' </summary>
   Private ReadOnly startAddressVersionNumber As Integer = 27

   ' ''' <summary>
   ' ''' The end address of the ROM Version Number.
   ' ''' </summary>
   'Private ReadOnly endAddresVersionNumber As Integer = 27

   ''' <summary>
   ''' The start address of the ROM checksum compliment.
   ''' </summary>
   Private ReadOnly startAddressChecksumCompliment As Integer = 28

   ''' <summary>
   ''' The end address of the ROM checksum compliment.
   ''' </summary>
   Private ReadOnly endAddressChecksumCompliment As Integer = 29

   ''' <summary>
   ''' The start address of the ROM checksum.
   ''' </summary>
   Private ReadOnly startAddressChecksum As Integer = 30

   ''' <summary>
   ''' The end address of the ROM checksum.
   ''' </summary>
   Private ReadOnly endAddressChecksum As Integer = 31

#End Region

#Region " Enumerations "

   ''' <summary>
   ''' Specifies a SNES ROM header type.
   ''' A headered ROM has SMC header and SNES header.
   ''' A headerless ROM has no SMC header, but still contains a SNES header.
   ''' Note that both a LoRom and HiRom images can be headered, or headerless.
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
   ''' </summary>
   Public Enum HeaderTypeEnum As Integer

       ''' <summary>
       ''' A headered SNES ROM.
       ''' The ROM contains an SMC header, and also contains an SNES header.
       ''' </summary>
       Headered = 0

       ''' <summary>
       ''' A headerless SNES ROM.
       ''' The ROM does not contains an SMC header, but contains an SNES header.
       ''' </summary>
       Headerless = 1

   End Enum

   ''' <summary>
   ''' Specifies a SNES ROM bank type.
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_ROM_layout</remarks>
   ''' </summary>
   Public Enum BankTypeEnum As UShort

       ''' <summary>
       ''' A LoROM maps each ROM bank into the upper half (being addresses $8000 to $ffff) of each SNES bank,
       ''' starting with SNES bank $00, and starting again with SNES bank $80.
       ''' </summary>
       LoRom = 32704US

       ''' <summary>
       ''' A HiROM maps each ROM bank into the whole (being addresses $0000 to $ffff) of each SNES bank,
       ''' starting with SNES bank $40, and starting again with SNES bank $80.
       ''' </summary>
       HiRom = 65472US

   End Enum

   ''' <summary>
   ''' Specifies a SNES ROM cartridge type.
   ''' <remarks>http://romhack.wikia.com/wiki/SNES_ROM_layout</remarks>
   ''' </summary>
   Public Enum CartridgeTypeEnum As Byte

       ''' <summary>
       ''' A ROM without save-RAM.
       ''' </summary>
       NoSram0 = 0

       ''' <summary>
       ''' A ROM without save-RAM.
       ''' <remarks>I didn't fully verified this value...</remarks>
       ''' </summary>
       NoSram1 = 1

       ''' <summary>
       ''' A ROM with save-RAM.
       ''' </summary>
       Sram = 2

   End Enum

#End Region

#Region " Exceptions "

   ''' <summary>
   ''' Exception that is thrown when a SNES ROM has an invalid format.
   ''' </summary>
   <Serializable>
   Public NotInheritable Class InvalidRomFormatException : Inherits Exception

       ''' <summary>
       ''' Initializes a new instance of the <see cref="InvalidROMFormatException"/> class.
       ''' </summary>
       Public Sub New()
           MyBase.New("The SNES ROM image has an invalid format.")
       End Sub

       ''' <summary>
       ''' Initializes a new instance of the <see cref="InvalidROMFormatException"/> class.
       ''' </summary>
       ''' <param name="message">The message that describes the error.</param>
       Public Sub New(ByVal message As String)
           MyBase.New(message)
       End Sub

       ''' <summary>
       ''' Initializes a new instance of the <see cref="InvalidROMFormatException"/> class.
       ''' </summary>
       ''' <param name="message">The message that describes the error.</param>
       ''' <param name="inner">The inner exception.</param>
       Public Sub New(ByVal message As String, ByVal inner As Exception)
           MyBase.New(message, inner)
       End Sub

   End Class

#End Region

#Region " Types "

   ''' <summary>
   ''' Defines a SNES ROM country.
   ''' </summary>
   <Serializable>
   Public NotInheritable Class CountryData

#Region " Properties "

       ''' <summary>
       ''' Gets the region, which can de PAL or NTSC.
       ''' </summary>
       ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
       ''' <value>The country code.</value>
       Public ReadOnly Property Region As RegionTypeEnum
           Get
               Return Me.regionB
           End Get
       End Property
       ''' <summary>
       ''' (backing field) The region, which can de PAL or NTSC.
       ''' </summary>
       Private ReadOnly regionB As RegionTypeEnum

       ''' <summary>
       ''' Gets the country code.
       ''' </summary>
       ''' <value>The country code.</value>
       Public ReadOnly Property Code As Byte
           Get
               Return Me.codeB
           End Get
       End Property
       ''' <summary>
       ''' (backing field) The country code.
       ''' </summary>
       Private ReadOnly codeB As Byte

       ''' <summary>
       ''' Gets the country name.
       ''' </summary>
       ''' <value>The country name.</value>
       Public ReadOnly Property Name As String
           Get
               Return Me.nameB
           End Get
       End Property
       ''' <summary>
       ''' (backing field) The country name.
       ''' </summary>
       Private ReadOnly nameB As String

#End Region

#Region " Enumerations "

       ''' <summary>
       ''' Specifies a SNES ROM region type.
       ''' <remarks>http://romhack.wikia.com/wiki/SNES_header</remarks>
       ''' </summary>
       Public Enum RegionTypeEnum As Integer

           ''' <summary>
           ''' A PAL SNES ROM.
           ''' </summary>
           Pal = 0

           ''' <summary>
           ''' An NTSC SNES ROM.
           ''' </summary>
           Ntsc = 1

       End Enum

#End Region

#Region " Countries "

       ''' <summary>
       ''' The known ROM countries, based on country code from 0 to 13, so countrycode 0 = Japan, countrycode 1 = United States, and so on...
       ''' Unknown country codes are just unknown.
       ''' </summary>
       Private ReadOnly countryDict As New Dictionary(Of Integer, String) From
           {
               {0, "Japan"},
               {1, "United States"},
               {2, "Unknown"},
               {3, "Unknown"},
               {4, "Unknown"},
               {5, "Unknown"},
               {6, "Unknown"},
               {7, "Unknown"},
               {8, "Spain"},
               {9, "Unknown"},
               {10, "Unknown"},
               {11, "Unknown"},
               {12, "Unknown"},
               {13, "Unknown"}
           }

#End Region

#Region " Regions "

       ''' <summary>
       ''' The country codes for NTSC region.
       ''' <remarks>http://romhack.wikia.com/wiki/SMC_header</remarks>
       ''' </summary>
       Private ReadOnly ntscRegionCodes As Integer() =
           {0, 1, 13}

       ''' <summary>
       ''' The country codes for PAL region.
       ''' <remarks>http://romhack.wikia.com/wiki/SMC_header</remarks>
       ''' </summary>
       Private ReadOnly palRegionCodes As Integer() =
           {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

#End Region

#Region " Constructors "

       ''' <summary>
       ''' Initializes a new instance of the <see cref="CountryData"/> class.
       ''' </summary>
       ''' <param name="countryCode">The SNES ROM country code.</param>
       ''' <exception cref="ArgumentException">Invalid country code.;countryCode</exception>
       Public Sub New(ByVal countryCode As Byte)

           If Not (Me.ntscRegionCodes.Concat(Me.palRegionCodes)).Contains(countryCode) Then
               Throw New ArgumentException(message:="Invalid country code.", paramName:="countryCode")

           Else
               Me.codeB = countryCode
               Me.nameB = Me.countryDict(countryCode)

               ' Determine region.
               If Me.ntscRegionCodes.Contains(countryCode) Then
                   Me.regionB = RegionTypeEnum.Ntsc

               ElseIf Me.palRegionCodes.Contains(countryCode) Then
                   Me.regionB = RegionTypeEnum.Pal

               End If

           End If

       End Sub

       ''' <summary>
       ''' Prevents a default instance of the <see cref="CountryData"/> class from being created.
       ''' </summary>
       Private Sub New()
       End Sub

#End Region

   End Class

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Prevents a default instance of the <see cref="SnesRom"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="SnesRom"/> class.
   ''' </summary>
   ''' <param name="romFilePath">The SNES ROM file path.</param>
   Public Sub New(ByVal romFilePath As String)

       Me.New(File.ReadAllBytes(romFilePath))

   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="SnesRom"/> class.
   ''' </summary>
   ''' <param name="romData">The raw byte-data of the ROM file.</param>
   Public Sub New(ByVal romData As Byte())

       Me.rawDataB = romData

       Me.VerifyRomFormat()
       Me.VerifyBankType()
       Me.ReadHeader()

   End Sub

#End Region

#Region " Private Methods "

   ''' <summary>
   ''' Reads the ROM header to retrieve the header data.
   ''' </summary>
   Private Sub ReadHeader()

       ' Read range of bytes.
       Me.nameB = Encoding.ASCII.GetString(Me.GetBytes(Me.startAddressName, Me.endAddressName)).Trim

       ' Read single bytes.
       Me.layoutB = Me.GetByte(Me.startAddressLayout)
       Me.cartridgeTypeB = DirectCast(Me.GetByte(Me.startAddressCartridgeType), CartridgeTypeEnum)
       Me.romSizeB = Me.GetByte(Me.startAddressRomSize)
       Me.ramSizeB = Me.GetByte(Me.startAddressRamSize)
       Me.CountryCode = Me.GetByte(Me.startAddressCountryCode)
       Me.LicenseCode = Me.GetByte(Me.startAddressLicenseCode)
       Me.VersionNumber = Me.GetByte(Me.startAddressVersionNumber)

   End Sub

   ''' <summary>
   ''' Verifies the SNES ROM format.
   ''' </summary>
   ''' <exception cref="SnesRom.InvalidRomFormatException">The SNES ROM image has an invalid format.</exception>
   Private Sub VerifyRomFormat()

       If (Me.rawDataB.Length Mod 1024 = 512) Then
           Me.headerTypeB = HeaderTypeEnum.Headered

       ElseIf (Me.rawDataB.Length Mod 1024 = 0) Then
           Me.headerTypeB = HeaderTypeEnum.Headerless

       Else
           Throw New InvalidRomFormatException(message:="The SNES ROM image has an invalid format.")

       End If

   End Sub

   ''' <summary>
   ''' Verifies the SNES ROM bank type.
   ''' </summary>
   ''' <exception cref="Exception">Cannot recognize the bank type.</exception>
   Private Sub VerifyBankType()

       If Me.HeaderIsAt(BankTypeEnum.LoRom) Then
           Me.bankTypeB = BankTypeEnum.LoRom

       ElseIf Me.HeaderIsAt(BankTypeEnum.HiRom) Then
           Me.bankTypeB = BankTypeEnum.HiRom

       Else
           Throw New Exception(message:="Cannot recognize the bank type.")

       End If

   End Sub

   ''' <summary>
   ''' Verifies the checksum.
   ''' </summary>
   ''' <remarks>
   ''' Offset 0x07FC0 in a headerless LoROM image (LoROM rom sin smc header)
   ''' Offset 0x0FFC0 in a headerless HiROM image (HiROM rom sin smc header)
   ''' </remarks>
   ''' <returns><c>true</c> if checksum is ok, <c>false</c> otherwise.</returns>
   Private Function VerifyChecksum() As Boolean

       If Me.HeaderType = HeaderTypeEnum.Headered Then
           Me.headerLocationB += 512
       End If

       Me.checksumComplimentB = BitConverter.ToUInt16(Me.GetBytes(Me.startAddressChecksumCompliment, Me.endAddressChecksumCompliment), startIndex:=0)

       Me.checksumB = BitConverter.ToUInt16(Me.GetBytes(Me.startAddressChecksum, Me.endAddressChecksum), startIndex:=0)

       Return CUShort(Me.Checksum Xor Me.ChecksumCompliment).Equals(UShort.MaxValue)

   End Function

   ''' <summary>
   ''' Determines whether the ROM header is in the specified address.
   ''' </summary>
   ''' <param name="address">The address.</param>
   ''' <returns><c>true</c> if the ROM header is in the specified address, <c>false</c> otherwise.</returns>
   Private Function HeaderIsAt(ByVal address As UShort) As Boolean

       Me.headerLocationB = address
       Return Me.VerifyChecksum()

   End Function

   ''' <summary>
   ''' Gets the specified byte from the raw byte-data.
   ''' </summary>
   ''' <param name="address">The address.</param>
   ''' <returns>The specified byte from the raw byte-data.</returns>
   Private Function GetByte(ByVal address As Integer) As Byte

       Return Buffer.GetByte(array:=Me.RawData,
                             index:=Me.HeaderLocation + address)

   End Function

   ''' <summary>
   ''' Gets the specified range of bytes from the raw byte-data.
   ''' </summary>
   ''' <param name="from">From address.</param>
   ''' <param name="to">To address.</param>
   ''' <returns>The specified bytes from the raw byte-data.</returns>
   Private Function GetBytes(ByVal from As Integer,
                             ByVal [to] As Integer) As Byte()

       Return Me.RawData.Skip(Me.HeaderLocation + from).Take(([to] - from) + 1).ToArray()

   End Function

   ''' <summary>
   ''' Replaces a single byte in the raw byte-data, with the specified data.
   ''' </summary>
   ''' <param name="address">the address.</param>
   ''' <param name="data">The byte-data.</param>
   Private Sub SetByte(ByVal address As Integer,
                      ByVal data As Byte)

       Buffer.SetByte(array:=Me.rawDataB,
                      index:=Me.HeaderLocation + address,
                      value:=data)

   End Sub

   ''' <summary>
   ''' Replaces the specified range of bytes in the raw byte-data, with the specified data.
   ''' </summary>
   ''' <param name="from">From address.</param>
   ''' <param name="to">To address.</param>
   ''' <param name="data">The byte-data.</param>
   ''' <exception cref="ArgumentException">The byte-length of the specified data differs from the byte-length to be replaced;data</exception>
   Private Sub SetBytes(ByVal from As Integer,
                       ByVal [to] As Integer,
                       ByVal data As Byte())

       If data.Length <> (([to] - from) + 1) Then
           Throw New ArgumentException("The byte-length of the specified data differs from the byte-length to be replaced.", "data")

       Else
           Buffer.BlockCopy(src:=data, srcOffset:=0,
                            dst:=Me.rawDataB, dstOffset:=Me.HeaderLocation + from,
                            count:=([to] - from) + 1)

       End If

   End Sub

   ''' <summary>
   ''' Sets the ROM name.
   ''' </summary>
   ''' <param name="name">The ROM name.</param>
   ''' <exception cref="ArgumentNullException">name</exception>
   ''' <exception cref="ArgumentException">The name should contain 21 or less characters;name.</exception>
   Private Sub SetName(ByVal name As String)

       Dim fixedNameLength As Integer = (Me.endAddressName - Me.startAddressName) + 1

       If String.IsNullOrEmpty(name) Then
           Throw New ArgumentNullException(paramName:="name")

       ElseIf (name.Length > fixedNameLength) Then
           Throw New ArgumentException(message:="The name should contain 21 or less characters.", paramName:="name")

       Else
           ' fill with spaces up to 21 character length.
           name = name.PadRight(totalWidth:=fixedNameLength, paddingChar:=" "c)

           Me.SetBytes(Me.startAddressName, Me.endAddressName, Encoding.ASCII.GetBytes(name))

       End If

   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Save the ROM changes to the specified file path.
   ''' </summary>
   ''' <param name="filePath">The ROM file path.</param>
   ''' <param name="replace">
   ''' If set to <c>true</c>, then replaces any existing file,
   ''' otherwise, throws an <see cref="IOException"/> exception if file already exists.
   ''' </param>
   ''' <exception cref="IOException">The destination file already exists.</exception>
   Public Sub Save(ByVal filePath As String, ByVal replace As Boolean)

       If Not replace AndAlso File.Exists(filePath) Then
           Throw New IOException(message:="The destination file already exists.")

       Else
           Try
               File.WriteAllBytes(filePath, Me.rawDataB)

           Catch ex As Exception
               Throw

           End Try

       End If

   End Sub

#End Region

End Class





Ejemplo para leer los datos de una ROM:
Código (vbnet) [Seleccionar]
Dim romDump As New SnesRom("C:\ROM.smc")
' Or...
' Dim romDump As New SnesRom(File.ReadAllBytes("C:\ROM.smc"))

Dim sb As New StringBuilder
With sb
   .AppendLine(String.Format("Name...............: {0}", romDump.Name))
   .AppendLine(String.Format("Bank Type..........: {0}", romDump.BankType.ToString))
   .AppendLine(String.Format("Cartridge Type.....: {0}", romDump.CartridgeType.ToString.ToUpper))
   .AppendLine(String.Format("Checksum...........: {0}", romDump.Checksum.ToString))
   .AppendLine(String.Format("Checksum Compliment: {0}", romDump.ChecksumCompliment.ToString))
   .AppendLine(String.Format("Country Region.....: {0}", romDump.Country.Region.ToString.ToUpper))
   .AppendLine(String.Format("Country Code.......: {0}", romDump.Country.Code.ToString))
   .AppendLine(String.Format("Country Name.......: {0}", romDump.Country.Name))
   .AppendLine(String.Format("Header Type........: {0}", romDump.HeaderType.ToString))
   .AppendLine(String.Format("Layout.............: {0}", romDump.Layout.ToString))
   .AppendLine(String.Format("License Code.......: {0}", romDump.LicenseCode.ToString))
   .AppendLine(String.Format("RAM Size...........: {0}", romDump.RamSize.ToString))
   .AppendLine(String.Format("ROM Size...........: {0}", romDump.RomSize.ToString))
   .AppendLine(String.Format("Version Number.....: {0}", romDump.VersionNumber.ToString))
End With

Clipboard.SetText(sb.ToString) : MessageBox.Show(sb.ToString)


Resultado de ejecución de la lectura de una ROM:
Name...............: THE LEGEND OF ZELDA
Bank Type..........: LoRom
Cartridge Type.....: SRAM
Checksum...........: 44813
Checksum Compliment: 20722
Country Region.....: NTSC
Country Code.......: 1
Country Name.......: United States
Header Type........: Headered
Layout.............: 32
License Code.......: 1
RAM Size...........: 3
ROM Size...........: 10
Version Number.....: 0


Ejemplo para modificar una ROM:
Código (vbnet) [Seleccionar]
Dim romDump As New SnesRom("C:\ROM.smc")
' Or...
' Dim romDump As New SnesRom(File.ReadAllBytes("C:\Rom.smc"))

With romDump
   .Name = "Elektrozoider"
   .Country = New SnesRom.CountryData(countryCode:=8) ' Spain.
   .VersionNumber = CByte(3)
   .Save("C:\Hacked.smc", replace:=True)
End With