Delphi tclientdataset .cds datetime 二进制时间格式解包

标签 delphi parsing datetime tclientdataset

我正在尝试解析 .cds delphi 数据库文件。简单的 int 值和字符串很容易解析。但我唯一无法理解的是 DateTime 格式。
我发现 6 个字节会影响 DateTime 值

我正在使用 python 和以下代码:

data = '\x00\x00' + '\xBC\xCE\x6F\xEC\xE7\xCC'
data_long = struct.unpack('Q', data)[0]

但是 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

For 2E D8 82 2D CE 47 E3 40 it will be 08.02.2008 10:38:00. Works fine.



但我仍然找不到有效的 8 字节字段 日期时间Issl 在我上面链接的文件中。也许有不同的日期时间格式?

最佳答案

Delphi 日期/时间 (TDateTime) 是一个 double 浮点数。这是一个 8 字节的值。您不需要添加任何打包或空字节。如果您必须这样做,那么您没有正确识别文件中的 double 值。

查看您链接到的示例 CDS,可以明智地将每个值解释为日期/时间(例如 DateRoshd、DateTimeIssl)后跟 8 个字节的数据。

读取 double 值后,该值的整数部分表示日期为自 1899 年 12 月 30 日以来的天数。小数部分是该日期的时间。

例如

1.0 = 31 Dec 1899, 00:00 (midnight)
2.5 =  1 Jan 1900, 12:00 (midday)

More information on the Delphi TDateTime data type can be found here .

关于Delphi tclientdataset .cds datetime 二进制时间格式解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835287/

相关文章:

Delphi ITask - 完成后我应该释放它吗?

delphi - 如何修改 Class-Completion (ctrl-shift-c) 生成的代码

用于重复字符串的python正则表达式

python - 如何切片以日期字段为索引的数据框?

delphi - 使用批处理脚本检测文件损坏

delphi - Delphi 中等效的 CCHAR 类型是什么?

java - JAVA中如何解析父子相关的JsonArray?

string - 如何将 f64 转换为 String 并解析回 f64?

python - 如何解析 ISO 8601 格式的日期?

python - 仅使用天数时, "datetime.timedelta"和 "dateutil.relativedelta.relativedelta"有什么区别?