2010-04-13 5 views
2

Nous avons un fichier binaire à partir duquel nous avons identifié les dates suivantes (comme Int64). Nous maintenant les faits suivants sur le format Date/Heure;Format binaire à date (C#) 64 bits

  • Le 64 bit La date a une résolution à la microseconde
  • Le 64 bit La date a une portée de 4095 ans
  • Le Int64 9053167636875050944 (0x7DA34FFFFFFFFFC0) = 9 Mars 2010
  • Le Int64 9053176432968073152 (0x7DA357FFFFFFFFC0) = Mars 2010 10e
  • Le Int64 9053185229061095360 (0x7DA35FFFFFFFFFC0) = 11 Mars 2010
  • Le Int64 9053194025154117568 (0x7DA367FFFFFFFFC0) = 12 Mars 2010

Toute aide pour trouver un moyen de convertir ceci en une date/heure C# valide est appréciée.

+0

J'ai ajouté des versions hexadécimales, car il est beaucoup plus facile de décoder des objets binaires si vous pouvez voir les bits. En hexadécimal, vous pouvez (si vous plissez les yeux). – unwind

+0

Dommage que ce ne soit pas simplement le nombre de microsecondes depuis un tel jour. Cependant, puisque DateTime .NET est de 100 nanosecondes, et que ces valeurs dépassent déjà 'DateTime.MaxValue.Ticks' ... – Powerlord

Répondre

0

Voici une solution:

string hex_data = "7DA34FFFFFFFFFC0"; 
     Int64 int_datetime = Convert.ToInt64(hex_data, 16); 

     int year = (int)(int_datetime >> 52); 
     int month = (int)((int_datetime >> 48) & 0x0F); 
     int day = (int)(((int_datetime >> 43) & 0x1F)); 

     int hour = (int)(((int_datetime >> 38) & 0x1F)) > 24 ? 0 : (int)(((int_datetime >> 38) & 0x1F)); 
     int min = (int)(((int_datetime >> 32) & 0x3F)) > 60 ? 0 : (int)(((int_datetime >> 32) & 0x3F)); 
     int sec = (int)(((int_datetime >> 26) & 0x3F)) > 60 ? 0 : (int)(((int_datetime >> 26) & 0x3F)); 
     int mili_sec = (int)(((int_datetime >> 16) & 0x3FF)) > 100 ? 0 : (int)(((int_datetime >> 16) & 0x3FF)); 
     int micro_sec = (int)(((int_datetime >> 6) & 0x3FF)) > 100 ? 0 : (int)(((int_datetime >> 6) & 0x3FF)); 

     string str_date_time = year.ToString("D4") + "/" + month.ToString("D2") + "/" + day.ToString("D2") + " " + hour.ToString("D2") + ":" + min.ToString("D2") + ":" 
      + sec.ToString("D2") + "." + mili_sec.ToString("D3"); 

     DateTime date_time_dt=DateTime.Parse(str_date_time); 

Retours:

09/03/2010 12:00:00 AM 

dans l'objet date_time_dt. Je ne pense pas que l'objet DateTime supporte les microsecondes en C#, mais je peux me tromper.

+0

"Les valeurs temporelles sont mesurées en unités de 100 nanosecondes appelées tiques, et une date particulière est le nombre de tics depuis minuit, le 1er janvier, 1 janvier (C.E.) dans le calendrier calendaire grégorien." - La documentation DateTime .NET – Powerlord

+0

ok, donc vous pouvez ajouter les microsecondes à la propriété Tick dans l'objet DateTime pour obtenir une heure plus précise? – lithium81

2

A partir des données hexagonales, au moins une chose est claire:

0x7da = 2010

Le 3 suivant est très probable Mars (mois 3).

2

0x7da = 2010
0x3 = 3 (Mars)
01001111 = les 5 premiers bits semble être le jour (9), les trois derniers sont toujours 1 de ce que vous nous avez montré
Le reste les bits représentent probablement en outre la résolution (heures, minutes, etc.)

2

partais de ce que @BlueRaja Le vert Unic dit, voici comment vous l'analyser:

 var X = 0x7da34fffffffffc0L; 
     var Year = X >> 52; 
     var Month = (X >> 48) & 0xf; 
     var Day = (X >> 43) & 0x1f; 
+1

Vous devrez convertir en int pour utiliser le constructeur DateTime. –