正在尝试解码日期时间编码-列出了示例



我有一个问题,几个月来一直困扰着我。我有一个应用程序,我正在尝试添加。为了做到这一点,我需要解码文件结构并能够模拟它。我已经解码了除日期/时间字段之外的所有内容。

我相信开头的十六进制11表示以下是日期/时间条目,因此不属于日期-时间。此外,下面的8个字节是日期-时间,并且给出了它们各自产生的日期/时间。我不知道的是转换是如何完成的。

如果有帮助的话,我相信生成该文件的源代码是用Delphi编写的。

以下是7个例子:

HEX Value                     Date Time Produced
--------------------------    ------------------
11 a2 97 78 0a dd 3e e4 40    07/07/2013 09:46:50 PM
11 5c 6c 32 0b dd 3e e4 40    07/07/2013 09:46:58 PM
11 67 b1 76 e0 dd 3e e4 40    07/07/2013 10:24:27 PM
11 38 a7 e1 55 bc 42 e4 40    08/07/2013 09:15:05 PM
11 d9 4e e4 58 bc 42 e4 40    08/07/2013 09:15:37 PM
11 d2 2a f9 13 49 89 dc 40    01/01/1980 03:24:15 AM
11 d4 fb 78 63 c5 42 e4 40    08/08/2013 04:02:29 AM
11 e5 01 c9 62 c5 42 e4 40    08/08/2013 04:02:21 AM

实际上,这些字符串看起来像Delphi TDatetime类型的十六进制表示,它是Double类型(8字节)的别名。其中,TDateTime值的整数部分是自12/30/1899以来经过的天数,TDateTime值的小数部分是经过的24小时的一天的小数。

在Delphi中,您可以使用HexToBin函数来解析这些值,如so

{$APPTYPE CONSOLE}
uses
  System.Classes,
  System.SysUtils;
function Decode(const HexStr: AnsiString) : TDateTime;
begin
   Assert(Length(HexStr)=16, 'Lenght must be 16');
   HexToBin(PAnsiChar(HexStr), @Result, SizeOf(TDateTime));
end;

begin
  try
     Writeln(DateTimeToStr(Decode('a297780add3ee440')));
     Writeln(DateTimeToStr(Decode('5c6c320bdd3ee440')));
     Writeln(DateTimeToStr(Decode('67b176e0dd3ee440')));
     Writeln(DateTimeToStr(Decode('38a7e155bc42e440')));
     Writeln(DateTimeToStr(Decode('d94ee458bc42e440')));
     Writeln(DateTimeToStr(Decode('d22af9134989dc40')));
     Writeln(DateTimeToStr(Decode('d4fb7863c542e440')));
     Writeln(DateTimeToStr(Decode('e501c962c542e440')));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

这将返回

07-07-2013 21:46:50
07-07-2013 21:46:58
07-07-2013 22:24:27
07-08-2013 21:15:05
07-08-2013 21:15:37
01-01-1980 3:24:15
08-08-2013 4:02:29
08-08-2013 4:02:21

最新更新