En un
primer análisis, podemos separar el archivo en lo que, según la documentación que enlazo Casimiro, se denominan "Archivos elementales". Estos están formados por una "cabecera" y un bloque de datos.
Algo así (es una aplicación de consola):
Código Delphi
[-]
program Tacografo;
{$APPTYPE CONSOLE}
uses
Windows, Sysutils, Classes;
type
TCabecera = packed record
FID: Word;
Tipo: Byte;
Longitud: Word;
end;
function FIDToStr(FID: Word): String;
begin
case FID of
$0002: Result:= 'ICC';
$0005: Result:= 'IC';
$0500: Result:= 'Application identification';
$C100: Result:= 'Card certificate';
$C108: Result:= 'CA certificate';
$0520: Result:= 'Identification';
$050E: Result:= 'Card download';
$0521: Result:= 'Driving license info';
$0502: Result:= 'Events data';
$0503: Result:= 'Faults data';
$0504: Result:= 'Driver activity data';
$0505: Result:= 'Vehicles uses';
$0506: Result:= 'Places';
$0507: Result:= 'Currents usage';
$0508: Result:= 'Control activity data';
$0522: Result:= 'Specific conditions';
else
Result:= 'Identificador desconocido';
end;
end;
var
Cabecera: TCabecera;
Datos: PByte;
begin
if ParamCount > 0 then
try
with TFileStream.Create(ParamStr(1),fmOpenRead or fmShareDenyWrite) do
try
Writeln('Analizando el fichero: ' + ParamStr(1));
GetMem(Datos,$FFFF);
try
while Read(Cabecera,Sizeof(Cabecera)) = Sizeof(Cabecera) do
begin
Cabecera.FID:= Swap(Cabecera.FID);
Cabecera.Longitud:= Swap(Cabecera.Longitud);
Writeln;
Writeln('FID: ' + IntToHex(Cabecera.FID,4));
Writeln('Descripcion: ' + FIDToStr(Cabecera.FID));
Writeln('Longitud: ' + IntToStr(Cabecera.Longitud) + ' Bytes');
FillChar(Datos^,$FFFF,#0);
ReadBuffer(Datos^,Cabecera.Longitud);
end;
finally
FreeMem(Datos);
end;
finally
Free;
end;
except
On E: Exception do
Writeln('Error: ' + E.Message);
end else
Writeln('Uso: ' + ParamStr(0) + ' < archivo >');
end.
El resultado de procesar el archivo de ejemplo:
Código:
FID: 0002
Descripcion: ICC
Longitud: 25 Bytes
FID: 0005
Descripcion: IC
Longitud: 8 Bytes
FID: 0501
Descripcion: Identificador desconocido
Longitud: 10 Bytes
FID: 0501
Descripcion: Identificador desconocido
Longitud: 128 Bytes
FID: 0520
Descripcion: Identification
Longitud: 143 Bytes
FID: 0520
Descripcion: Identification
Longitud: 128 Bytes
FID: 0502
Descripcion: Events data
Longitud: 1728 Bytes
FID: 0502
Descripcion: Events data
Longitud: 128 Bytes
FID: 0503
Descripcion: Faults data
Longitud: 1152 Bytes
FID: 0503
Descripcion: Faults data
Longitud: 128 Bytes
FID: 0504
Descripcion: Driver activity data
Longitud: 13780 Bytes
FID: 0504
Descripcion: Driver activity data
Longitud: 128 Bytes
FID: 0505
Descripcion: Vehicles uses
Longitud: 6202 Bytes
FID: 0505
Descripcion: Vehicles uses
Longitud: 128 Bytes
FID: 0506
Descripcion: Places
Longitud: 1121 Bytes
FID: 0506
Descripcion: Places
Longitud: 128 Bytes
FID: 0508
Descripcion: Control activity data
Longitud: 46 Bytes
FID: 0508
Descripcion: Control activity data
Longitud: 128 Bytes
FID: 0522
Descripcion: Specific conditions
Longitud: 280 Bytes
FID: 0522
Descripcion: Specific conditions
Longitud: 128 Bytes
FID: C100
Descripcion: Card certificate
Longitud: 194 Bytes
FID: C108
Descripcion: CA certificate
Longitud: 194 Bytes
Ahora lo que necesitaríamos es saber la estructura de cada uno de esos bloques de datos.