Ver Mensaje Individual
  #14  
Antiguo 16-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
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.

Última edición por seoane fecha: 16-05-2007 a las 17:42:39.
Responder Con Cita