2017-08-08 38 views
0

我正在寫一個低級別的工具來掃描和恢復損壞的Jet4 MDB文件中的數據。我正在掃描頁面,解析行和解碼列。在Jet4中如何編碼DateTime和Number格式?

如果我有日期時間字段的原始8字節值,如何將它轉換爲日期的字符串表示形式,如「MM-DD-YY HH:MM:SS」?

如果我有單字段大小和小數點後3位數字字段的原始4字節值,我該如何將此值轉換爲浮點數/雙精度?

是否有描述所有訪問字段如何編碼和存儲在磁盤上的文檔?

謝謝。

+1

您確定要重新發明此滾輪嗎?無論如何,我會看看例如http://jackcess.sourceforge.net/ – Andre

+1

你可以試着看看其他的開源程序來回答這樣的問題,比如[Jackcess](https://sourceforge.net/projects/jackcess/files/jackcess/) (java)或[mdbtools](https://github.com/brianb/mdbtools)(C)。 Mdbtools有一個特殊的文件,其中包括他們關於如何存儲事物的文檔[這裏](https://github.com/brianb/mdbtools/blob/master/HACKING) –

回答

2

如果我有日期時間字段的原始8字節值,該如何將其轉換爲日期的字符串表示形式,如「MM-DD-YY HH:MM:SS」?

以little-endian格式訪問存儲日期/時間值爲64位(8字節)Double值。整數部分表示在Access「時代」(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 
0

編號JET格式是Microsoft專有的,沒有記錄。

至於Date數據類型,這只是一個double。

既不是雙重也不是單一格式。如你所說,這是一個標準的浮點值。

+0

正如我在主要帖子的評論中所說的,mdbtools已經做了一個關於如何存儲事物的一些文檔的文件,可以在這裏找到(https://github.com/brianb/mdbtools/blob/master/HACKING) –

+0

謝謝@ErikvonAsmuth,看起來相當全面。我的意思是缺少_official_文檔。 – Gustav