gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:15:19 30 4
gpt4 key购买 nike

我正在尝试解析 .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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com