
¿Cómo leer archivos .DAT?
#1
Escrito 06 febrero 2009 - 09:13
Saludos.
#2
Escrito 06 febrero 2009 - 09:43
#3
Escrito 06 febrero 2009 - 09:46
esos son archivos binarios, y al menos que conozcas su estructura no creo que puedas hacer mucho.
Bueno, esos datos los saco desde un Lector Dactilar de control de asistencias, y éste es el archivo que deja la cual anexo, a ver si alguien me da un empujoncito.
Saludos.
Archivos adjuntos
#4
Escrito 06 febrero 2009 - 10:47
Lo abrí con Notepad y Excel y sale sin formato.
No lo he probado pero prueba en Delphi con un TStringList a ver si sale algo.
Sigue comentando los avances.
#5
Escrito 06 febrero 2009 - 10:57
Saludos.
#6
Escrito 06 febrero 2009 - 11:10
¿Y no te sería más sencillo preguntar al fabricante? Si es un archivo binario, deducir cómo está formado puede llegarte a costar bastante (en tiempo sobretodo)
Espero te sirva
Nos leemos
#8
Escrito 06 febrero 2009 - 03:56

Por lo demás el archivo esta plagado de ceros, es decir del carácter #0, así que un TStringList no te lo va a leer bien. Es evidente que los datos están guardados de forma binaria, y para saber como esta guardada la información tienes que saber con precisión que datos se guardan y así poder deducir que es cada cosa. Pero aun así es una tarea complicada.
#9
Escrito 07 febrero 2009 - 08:39
type TStruct = record wIndex: Word; bFlag: Byte; cbValue: array [0..7] of Char; cbName: array [0..27] of Char; bValue: Boolean; qwAlwaysZero: Int64; Value: array [0..23] of Char; end; procedure TForm1.Button1Click(Sender: TObject); var hFile, Size, Count, Index, Value, Hours: Cardinal; Item: array of TStruct; begin hFile := _lopen('user.dat', OF_READ); Size := GetFileSize(hFile, nil); Count := Size div SizeOf(TStruct); SetLength(Item, Count); _lread(hFile, Item, Size); ListBox1.Clear; Caption := Item[0].cbName; for Index := 0 to Count - 1 do begin Value := StrToInt(Item[Index].Value); Hours := Value div 3600; Value := Value mod 3600; ListBox1.AddItem(IntToStr(Item[Index].wIndex) + '(' + Item[Index].Value + ') - ' + IntToStr(Hours) + ':' + IntToStr(Value div 60) + ':' + IntToStr(Value mod 60), nil); end; end;
La anterior es una estructura "creada" por mi, pero notarás que es bastante congruente. La forma en que proceso "Value" se me ocurrio al ver el rango de dicho valor (puede ser el tiempo de retraso), aunque eso solo lo podras notar tu.
Salud
#10
Escrito 07 febrero 2009 - 10:34


Saludos.
#11
Escrito 07 febrero 2009 - 12:23
Estuve mirando el código y la estructura que creaste Little Bro y no necesito decirte que me impresiona, solo tengo una duda, como identificaste el wIndex porque me imagino que ese es el que nos servirá para determinar el tamaño del "registro", y de esa forma saber que son 72 bytes por cada registro.
Salud OS
#12
Escrito 07 febrero 2009 - 02:11
#13
Escrito 07 febrero 2009 - 02:29

Como en casi todos los formatos de archivo, inferí que “RAMON” pertenecía a parte del cabezal del archivo el cual siendo también una estructura, no debiese tener el mismo formato que el resto de las “estructuras” del archivo, entonces analice posibles registros con formato parecido, entonces note que había alguna alineación de 4 u 8 Bytes.;

Asc;0:0;0;0;0;Dec;0;0;0;0;0;0;0;0;0;0;0;Asc;0:0;0;0;0;Dec;0;0;0;0;0;0;0;0;0;0;0;Asc;…
Hasta el final del archivo se puede ver la misma secuencia, del cual el mínimo común es de 18 DWORDs (72 Bytes); una prueba de modulo con el tamaño del archivo confirma la suposición y formula una nueva duda acerca del supuesto cabezal o formato de los primeros registros. Esto sumado a un vistazo a la cola del archivo suponemos (y probamos) la nueva estructura;
Dec;0;0;0;0;0;0;0;0;0;0;0;Asc

De aquí en adelante la estructura final la hice con la ayuda del depurador de Delphi procurando siempre usar el máximo de tamaño en los tipos de datos de la estructura para que se vea mas “limpia”.
Salud
#14
Escrito 07 febrero 2009 - 02:50
Solo decir lo que ya he dicho muchas veces, genial amigo.

Saludos
PD: Como me gusta cuando explicas lo inentendible.
