psy*_*tic 1 delphi datetime parsing tclientdataset
我正在尝试解析.cds delphi数据库文件.简单的int值和字符串很容易解析.但唯一一个我无法理解的是DateTime格式.我找到了影响DateTime Value的6个字节
我正在使用python和以下代码:
data = '\x00\x00' + '\xBC\xCE\x6F\xEC\xE7\xCC'
data_long = struct.unpack('Q', data)[0]
Run Code Online (Sandbox Code Playgroud)
但是struct.unpack没有6个字节的类型值,所以我添加了\ x00\x00来生成8个字节的长值('Q'选项)
这是一个小样本.cds文件,有一行https://yadi.sk/d/PkZKy50YgCmqE
DateTimeIssl value ="16.04.2015 9:25:47"
我找到了6个十六进制值,但无法正确解压缩.任何人都可以告诉我如何阅读它,或者可能给我一些关于.cds文件结构的文档的链接?
更新: 好的!感谢Deltics指导我如何阅读TDateTime.我在互联网上找到了一些测试值,我编写了解码函数,将其转换为Python日期时间对象.
data = '\x2E\xD8\x82\x2D\xCE\x47\xE3\x40'
data_double = struct.unpack('d', data)[0]
double_split = str(data_double).split('.')
SECONDS_IN_DAY = 60*60*24
time_from_starting_date = timedelta(days=int(double_split[0]), seconds=int(SECONDS_IN_DAY * (float(double_split[1]) * pow(0.1, len(double_split[1])))))
starting_date = datetime(1899, 12, 30)
result_date = starting_date + time_from_starting_date
print time_from_starting_date
print result_date
Run Code Online (Sandbox Code Playgroud)
对于2E D8 82 2D CE 47 E3 40,它将是08.02.2008 10:38:00.工作良好.
但我仍然找不到上面链接的文件中的字段DateTimeIssl的有效8字节.也许有不同的日期时间格式?
Delphi日期/时间(TDateTime)是双精度浮点.这是一个8字节的值.您不需要添加任何打包或空字节.如果您必须这样做,那么您还没有在文件中正确识别双值.
查看链接到的示例CDS,每个可以合理地解释为日期/时间的值(例如DateRoshd,DateTimeIssl)后跟8个字节的数据.
读取双精度值后,该值的整数部分表示日期为自1899年12月30日以来的天数.小数部分是该日期的时间.
例如
1.0 = 31 Dec 1899, 00:00 (midnight)
2.5 = 1 Jan 1900, 12:00 (midday)
Run Code Online (Sandbox Code Playgroud)
有关Delphi TDateTime数据类型的更多信息,请参见此处.
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |