2017-08-08 7 views
0

私は、損傷を受けたJet4 MDBファイルからデータをスキャンして回復するために、低レベルのツールを作成しています。私はページをスキャンし、行を解析し、列をデコードしています。DateTimeとNumberの形式はどのようにJet4でエンコードされていますか?

Datetimeフィールドの生の8バイト値を持つ場合、これを「MM-DD-YY HH:MM:SS」などの日付の文字列表現に変換するにはどうすればよいですか?

NumberフィールドにSingleフィールドサイズと3桁の小数点以下4桁の値がある場合、どのようにこの値をfloat/doubleに変換できますか?

すべてのアクセスフィールドがエンコードされ、ディスクに格納される方法を記述する文書はありますか?

ありがとうございます。

+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」などの日付の文字列表現に変換するにはどうすればよいですか?

アクセスには、リトルエンディアン形式の64ビット(8バイト)Double値として日付/時刻の値が格納されます。整数部分は、アクセス「エポック」(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、それはかなり包括的です。私が欠けていたのは_公式の文書です。 – Gustav

関連する問題