Leer datos de archivo binario

11/05/2010 - 18:54 por Saga | Informe spam
Saludos. En esta ocasion tengo un archivo que contiene datos, tales como
numeros, fechas y bytes. Desarrolle el siguiente codigo para leer esta
informaicon:

Dim TheBytes() As Byte
Dim strNombre As String = ""
Dim bytHeader(3) As Byte
Dim bytByte As Byte
Dim lngTimeStamp As Integer
Dim bytExtra(1) As Byte
Dim intFH As Integer

On Error GoTo ehUncompressFile


intFH = FreeFile()

FileOpen(intFH, strArchivoDatos, OpenMode.Binary)

FileGet(intFH, (bytHeader))


If bytHeader(0) = 225 And bytHeader(1) = 179 Then

'Consigue la fecha y hora (num de segundos desde fecha en 1970).
FileGet(intFH, lngTimeStamp)

'Lee otros 2 bytes.
FileGet(intFH, (bytExtra))

If (bytHeader(3) And 16) = 16 Then

'Consigue el nombre.
Do
FileGet(intFH, bytByte)

If bytByte > 0 Then
strNombre = strNombre & Chr(bytByte)
End If
Loop Until bytByte = 0
End If


ReDim TheBytes(CInt(LOF(intFH) - 1))

FileGet(intFH, (TheBytes))

Basicamente, leo una cabecaera de 4 bytes, reviso que la "llave" sea la
correcta en los primeros dos bytes. Si lo es, consigo 4 bytes que tienen
una fecha y hora y otros dos byte, luego si el 5o bit del cuarto byte esta
puesto (-1) entonces consigo un nombre. Por fin el leo resto de los datos
a un arreglo (The Bytes)

Esta rutina la converti de otra en VB6 y estaba probada y funcionando
bien, solo que hoy que regrese a hacer algunas pruebas finales me
encuentro que no esta funcoinando. La primera instruccion de lectura
que lee los 4 bytes al arreglo byeCabecera() solo lee ceros. Ya revise
el archivo y efectivamente estan ahi los primeros 4 bytes tal como los
espero. No se porque ahora esta leyendo ceros. Cualquier orientacion
es bienvenida, o bien un metodo alterno mas confiable para poder
realizar la equivalente funcion. Gracias, Saga
 

Leer las respuestas

#1 SoftJaén
13/05/2010 - 14:57 | Informe spam
Hola, Saga:

No sabría decirte donde está el problema. Pero ya que estás utilizando
Visual Basic .NET, prueba a utilizar un objeto BinaryWriter (para escribir
en un archivo binario) y un objeto BinaryReader (para su posterior lectura).
Ambas clases se encuentran dentro del espacio de nombres System.IO, espacio
que deberás de importar en tu proyecto.

Por ejemplo, vamos a guardar en un archivo binario, un entero de 4 bytes
(Integer), seguidos de los ticks de una fecha cualquiera (un valor Long), y
a continuación, una cadena alfanumérica (String):

Imports System.IO

' Creamos un nuevo archivo binario con
' permisos de escritura.
'
Dim st As Stream = _
File.Open("C:\Temp\Archivo.dat", _
FileMode.Create, FileAccess.Write)

' Creamos un objeto BinaryWriter que lo
' asociaremos a la secuencia del archivo.
'
Using bw As New BinaryWriter(st)

' Escribimos un valor entero.
'
Dim n As Integer = 12345
bw.Write(n)

' Escribimos la fecha y hora actual, o mejor dicho, los
' Ticks correspondientes a la fecha y hora actual.
'
bw.Write(DateTime.Now.Ticks)

' Escribimos una valor alfanumérico
bw.Write("¡Hola, Mundo!")

' Cerramos los objetos
bw.Close()
st.Close()

End Using

Como sabemos el orden de los datos, significa que sabemos los tipos de datos
que contienen. Por tanto, bastaría con utilizar los métodos ReadXXX de un
objeto BinaryReader:

' Creamos una secuencia para leer el archivo binario
'
Dim st As Stream = _
File.Open("C:\Temp\Archivo.dat", _
FileMode.Open, FileAccess.Read)

' Creamos un objeto BinaryReader que lo
' asociaremos a la secuencia del archivo.
'
Using br As New BinaryReader(st)

' Leemos el primer valor que sabemos
' que es un Integer
'
Dim n As Integer = br.ReadInt32()

Debug.WriteLine(n)

' Leemos los Ticks de la fecha
'
Dim fecha As DateTime = New DateTime(br.ReadInt64)

Debug.WriteLine(fecha)

' Leemos el valor alfanumérico
Dim s As String = br.ReadString()

Debug.WriteLine(s)

' Cerramos los objetos
br.Close()
st.Close()

End Using

Mira a ver si de ésta manera puedes leer tu archivo binario.

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Preguntas similares