Date4和Number格式如何在Jet4中编码?

时间:2017-08-08 06:27:20

标签: ms-access jet

我正在编写一个低级工具来扫描和恢复损坏的Jet4 MDB文件中的数据。我正在浏览页面,解析行和解码列。

如果我有Datetime字段的原始8字节值,我该如何将其转换为日期的字符串表示,例如" MM-DD-YY HH:MM:SS"?

如果我有一个具有单个字段大小和3个小数位的数字字段的原始4字节值,我该如何将该值转换为float / double?

是否有任何文档描述了所有访问字段如何编码并存储在磁盘上?

谢谢。

2 个答案:

答案 0 :(得分:2)

  

如果我有Datetime字段的原始8字节值,如何将其转换为日期的字符串表示形式,例如“MM-DD-YY HH:MM:SS”?

Access以小端格式将日期/时间值存储为64位(8字节)Double值。整数部分表示Access“epoch”(1899-12-30 00:00:00)之前或之后的天数,小数部分的绝对值表示当天的时间部分 (例如,0.5 =中午)。因此,例如,在Python中,我们将字节转换为datetime值,如下所示:

from datetime import datetime, timedelta
import struct

# bytes as retrieved from .accdb or .mdb file
d_as_bytes = b'\x35\x07\x2F\x2C\x93\x63\xDD\xC0'

d_as_double = struct.unpack('<d', d_as_bytes)[0]  # -30094.29957175926
d_integer_part = int(d_as_double)  # -30094
d_fractional_part = abs(d_as_double - d_integer_part)  # 0.29957175926
access_epoch = datetime(1899, 12, 30)
d = access_epoch + timedelta(days=d_integer_part) + timedelta(days=d_fractional_part)
print(d)  # 1817-08-08 07:11:23

答案 1 :(得分:0)

没有。 JET格式是Microsoft专有的,没有记录。

至于Date数据类型,这只是一个双倍。

双重或单一都不带格式。如您所述,这些是标准浮点值。