Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

elGuille.hosting: Ofertas de alojamiento
posiblemente los mejores precios
¡¡¡ Ahora con el doble de casi todo !!!

Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

20/dic/2007
Cuando pegues código, fíjate de no pegar los espacios del principio, si usas copiar y pegar desde Visual Studio, seguro que esto te ayudará a saber cómo hacer selecciones de código: Cómo... Seleccionar bloques de código con Visual Studio. Gracias.

  Foro: .NET VB Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 43083 - Leer secuencia de Bytes en un archivo binario
IDAsuntoFechaNick 
43083 Leer secuencia de Bytes en un archivo binario28/07/08 15:58CaMoVi   
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
IDAsuntoFechaNick 
43135 Re: Leer secuencia de Bytes en un archivo binario (Resp: 43083)30/07/08 18:44elGuille [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.
IDAsuntoFechaNick 
43140 Re: Leer secuencia de Bytes en un archivo binario (Resp: 43135)30/07/08 21:18elGuille [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.
IDAsuntoFechaNick 
43146 Re: Leer secuencia de Bytes en un archivo binario (Resp: 43083)30/07/08 23:08elGuille [MVP]   
Aquí tienes el código para guardar esa imagen:
http://www.elguille.info/NET/dotnet/extraer_imagen_de_fichero_PBP.aspx

   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
43259 Re: Leer secuencia de Bytes en un archivo binario (Resp: 43146)04/08/08 14:14CaMoVi   
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.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 33 - App. iniciada: 18/11/2017 12:49:09 GMT - La hora GMT del servidor es: 18/11/2017 19:37:21 GMT