Lire un TDateTime (delphi)

Lire un TDateTime (delphi) - C - Programmation

Marsh Posté le 01-12-2006 à 12:07:46    

Salut,
 
Je souhaite lire une valeur TDateTime (Delphi) se trouvant dans l'entête d'un fichier depuis un programme que je code en C. Cependant j'éprouve quelques difficultés sur la manière dont je dois m'y prendre.
 
En cherchant dans la doc, j'ai appris que ce type enregistre la date dans un "double" et que la valeur correspond au nombre de jours écoulés entre la date d'aujourd'hui et le 30 (ou 31)/12/1899.  
 
Je ne sais pas comment m'y prendre, avez-vous une idée ?
 
Merci.

Reply

Marsh Posté le 01-12-2006 à 12:07:46   

Reply

Marsh Posté le 01-12-2006 à 13:45:47    

  • Solution 1 : se débrouiller pour que le programme delphi enregistre cette date de manière plus portable.


  • Solution 2, bricolage : récupérer la taille d'un double tel qu'il est compris par Delphi et tenter de l'interpréter comme ce langage (par contre je vois pas l'intérêt de stocker une date dans un double :??:)

Reply

Marsh Posté le 01-12-2006 à 19:38:46    

Elmoricq a écrit :

  • Solution 1 : se débrouiller pour que le programme delphi enregistre cette date de manière plus portable.


  • Solution 2, bricolage : récupérer la taille d'un double tel qu'il est compris par Delphi et tenter de l'interpréter comme ce langage (par contre je vois pas l'intérêt de stocker une date dans un double :??:)

Solution 1 : Je ne peux malheureusement plus toucher au programme Delphi, il est déjà "assez" répendu dans sa version actuelle et je pense que ça va être un gros merdier si une variante sort.
 
Solution 2 : C'est ce que j'ai commencé à faire. Le double tient sur 8 octets.
 
Quand je regarde dans un éditeur hexadécimal, la valeur d'aujourd'hui "01/12/2006" est comme suit : 80 11 E3 40. Mais bon, je capte vraiment pas comment on tombe là-dessus.
 
Extrait de la doc :
 

Delphi syntax:
 
type TDateTime = type Double;
 
Description
 
Most CLX objects represent date and time values using a TDateTime value. In Delphi, TDateTime is a type that maps to a Double. In C++, the TDateTime class corresponds to the Delphi TDateTime type.  
 
The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.  
 
Following are some examples of TDateTime values and their corresponding dates and times:
 
0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am


Si vous avez une piste, n'hésitez pas. Merci :-)

Reply

Marsh Posté le 01-12-2006 à 20:50:54    

Inekman a écrit :

Solution 2 : C'est ce que j'ai commencé à faire. Le double tient sur 8 octets.

 

Quand je regarde dans un éditeur hexadécimal, la valeur d'aujourd'hui "01/12/2006" est comme suit : 80 11 E3 40.

[:arrakys]
Un peu de cohérence ne ferai pas de mal...


Message édité par Emmanuel Delahaye le 01-12-2006 à 20:51:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-12-2006 à 21:15:59    

Oui absolmument, j'ai oublié d'ajouter les 4 octets "00 00 00 00" qui se trouvent avant, ce qui donnent "00 00 00 00 80 11 E3 40".

Reply

Marsh Posté le 01-12-2006 à 21:51:51    

Si tu le traite comme un double, ça se lit comme 39052,0. soit 3952 jours entiers et 0 fraction de 24 heures à compter du 31/12/1899 à 12 heures. l'avantage du double c'est de pouvoir faire des comparaisons et des différences de dates facilement.

Reply

Marsh Posté le 01-12-2006 à 21:52:35    

Inekman a écrit :

Oui absolmument, j'ai oublié d'ajouter les 4 octets "00 00 00 00" qui se trouvent avant, ce qui donnent "00 00 00 00 80 11 E3 40".


Est-ce que ca signifie 0x40E3118000000000  (LSB first, little endian), et si oui, quel est la définition du format des flottants en Delphi ?

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main (void)
  4. {
  5.    double x;
  6.    unsigned char b[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0xE3, 0x40 };
  7.    memcpy (&x, b, sizeof x);
  8.    printf ("sizeof x = %u. x =%f\n", (unsigned) sizeof x, x);
  9.    return 0;
  10. }

Je trouve bien


sizeof x = 8. x =39052.000000

 

Press ENTER to continue.


mais sans spec, je suis incapable de dire si c'est correct...


Message édité par Emmanuel Delahaye le 01-12-2006 à 21:58:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-12-2006 à 09:26:54    

videaste95 a écrit :

Si tu le traite comme un double, ça se lit comme 39052,0. soit 3952 jours entiers et 0 fraction de 24 heures à compter du 31/12/1899 à 12 heures. l'avantage du double c'est de pouvoir faire des comparaisons et des différences de dates facilement.


 
Merci pour l'explication [:romf]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed