我有一个问题,几个月来一直困扰着我。我有一个应用程序,我正在尝试添加。为了做到这一点,我需要解码文件结构并能够模拟它。我已经解码了除日期/时间字段之外的所有内容。
我相信开头的十六进制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