ID | Asunto | Fecha | Nick | |
43083 | Leer secuencia de Bytes en un archivo binario | 28/07/08 15:58 | CaMoVi | | |
Hola, he estado buscando tanto en el foro como en la página y no he conseguido la información que necesito, por eso abro este hilo. Programo por afición y en determinados aspectos me pierdo. Esta es mi duda: Se trata de abrir un archvo PBP (formato PSP) y extraer los ficheros que contiene, en concreto "icon0.png". En la documentación del fichero indica la posición en la que buscar el fichero, pero no soy capaz de localizarlo. Os detallo el encabezado: The files are simply put into the PBP file one after another (no kind of EOF markers or anything). The 40-byte header describes the offset of each file as a 32-bit unsigned little endian value. The structure of the header is as follows:
Offset Contents Remarks 0-3 File type/descriptor Always a null byte followed by "PSP". 4-7 PBP Version (?) Always 00 00 01 00. 8-11 Offset of PARAM.SFO 12-15 Offset of ICON0.PNG 16-19 Offset of ICON1.PMF 20-23 Offset of PIC0.PNG 24-27 Offset of PIC1.PNG 28-31 Offset of SND0.AT3 32-35 Offset of DATA.PSP 36-39 Offset of DATA.PSAR
Hasta ahora solo he conseguido crear una matriz de bytes con el contenido del fichero.
Dim iRead As Integer = 0 Dim letter As Integer = 0 Dim stream As System.IO.FileStream = New System.IO.FileStream("C:\Users\Carlos\Desktop\Temporal\EBOOT.PBP", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None, 8, IO.FileOptions.None) Dim reader As System.IO.BinaryReader = New System.IO.BinaryReader(stream) Dim buffer(stream.Length) As Byte Dim bufferw(1024) As Byte
iRead = reader.Read(bufferw, 12, 1024)
letter = reader.Read(buffer, 0, stream.Length)
Os agradezo vuestra ayuda. Un saludo |
|
ID | Asunto | Fecha | Nick | |
43135 | Re: Leer secuencia de Bytes en un archivo binario (Resp: 43083) | 30/07/08 18:44 | elGuille [MVP] | | |
Usa un objeto del tipo BinaryReader, posiciona el puntero en la posición que quieres leer, por ejemplo para el ICON0.PNG en la posición indicada en los bytes 12 a 15 y supuestamente llegará a tener una longitud que estará indicada por la posición anterior que te indica en los bytes 16 a 19 (ICON1.PMF). Suponiendo que la posición de inicie es "pos", la longitud es "longitud" y el BinaryReader está en la variable "br" podrías hacer algo así: br.BaseStream.Seek(pos, System.IO.SeekOrigin.Begin) y leer los "longitud" bytes (y asignarlos al array "by") con: by = br.ReadBytes(longitud) Ten en cuenta que los "offset" están en little endian, es decir, son cuatro bytes que estarán escritos "al revés", es decir si el número en hexadecimal es: 0112a380 estará como 80a31201, pero mejor es que hagas tus pruebas para asegurarte de que obtienes el número de forma correcta.     elGuille
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
43140 | Re: Leer secuencia de Bytes en un archivo binario (Resp: 43135) | 30/07/08 21:18 | elGuille [MVP] | | |
Teniendo el valor del "offset", puedes usar estas dos funciones para obtener el valor Integer correspondiente: ' Para los valores guardados como little endian
' (32-bit unsigned little endian)
Public Function
Offset2Hex(ByVal offset As String) As String
' Si el valor es C0010000
' El valor devuelto será 000001C0
If Len(offset) <> 4 Then
Return "00000000"
End If
' De forma simple para que se entienda mejor
'Dim h1, h2, h3, h4 As String
'h1 = Asc(Mid(offset, 1, 1)).ToString("x2")
'h2 = Asc(Mid(offset, 2, 1)).ToString("x2")
'h3 = Asc(Mid(offset, 3, 1)).ToString("x2")
'h4 = Asc(Mid(offset, 4, 1)).ToString("x2")
'Return h4 & h3 & h2 & h1
' De forma no tan simple, pero igual de efectiva
Dim hx As String = ""
For i As Integer = 0 To offset.Length - 1
hx = Asc(Mid(offset, i + 1, 1)).ToString("x2") & hx
Next
Return hx
End Function
Public Function
Offset2Integer(ByVal offset As String) As Integer
Dim sHex As String = Offset2Hex(offset)
Return CInt(Val("&H" & sHex))
End Function Voy a ver si preparo un articulillo que extraiga esa imagen de ese tipo de fichero, ya que el código es largo y así otros lo pueden aprovechar.     elGuille
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
43146 | Re: Leer secuencia de Bytes en un archivo binario (Resp: 43083) | 30/07/08 23:08 | elGuille [MVP] | | |
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
43259 | Re: Leer secuencia de Bytes en un archivo binario (Resp: 43146) | 04/08/08 14:14 | CaMoVi | | |
Muchas gracias por esta explicación y por la clase. Llevaba unos días dandole vueltas al tema sin conseguir el resultado que queria. Te agradezco también que fuese tan rápido.
Un saludo.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |