はじめまして。
早速ですがParadoxDBで作成された*.DBファイルをvbで書き換えるものを
作ろうと思っていますが、タイトルの件で壁にぶつかりました。
ファイルに保存されたDataTime形式はバイナリになり
C2 CC D0 37 9F E1 00
となります。(これの場合は2008年11月1日12時ちょうど)
このバイナリを元の状態(人間にわかりやすい)に戻せなくて困っています。
どなたか、Paradoxについてご存知の方がいればよろしくお願いします。
すみません。先ほどの書き込みの
バイナリ部分は
CC D0 37 9F E1 00 00
が正しいです。
よろしくお願いします。
ここの過去ログ検索したら・・・
http://madia.world.coocan.jp/vb/vb_bbs/200308/200308_03080056.html
参考になると思いますが。
以上。
オショウさんありがとうございます。
私も過去ログは拝見しましたがDBに接続して
書き換えではなく、ローカルでファイルを直接
書き換えしたいのでちょっと異なるかと・・・
すみません。引き続きおねがいします。
何故、直接読み書きしたいのでしょう?
基本、DBはアクセスさせる為の手法が指定されています。
フォーマットが公開されていないのは一般的なので、頑張って
もどうにもならない場合が非常に多いかと。
因みに、内部解析したら違法行為と取られる場合が一般的です。
よって、そういう行為はお止めになった方が得策かと。
以上。
Paradoxの日付が当てはまるか分かりませんが、
1970年1月1日 00:00:00を基準としたミリ秒単位の日付としてるなら
指定日時から差し引いて、16進数化するといいかも知れません。
http://architect360.apricot-jp.com/500tips/datetime.html
http://www.thedbcommunity.com/index.php?option=com_content&task=view&id=33&Itemid=56
西暦0001年1月1日からのmsを浮動小数点(8バイト)で保持しているみたいです。
// 確認してみました
,以降はms(ミリセコンド)
2008/11/02 12:00:00.000 //C2 CC D0 3A 33 0F 00 00 // -63361310400,000 -A
2008/11/01 12:00:00.000 //C2 CC D0 37 9F E1 00 00 // -63361224000,000 -B
マイナスになっているので+に(何故かは不明)
(A - B)/1000(ms) = 86400(S)
86400 / 60(S) = 1440(M)
1440 / 60(M) = 24(h)
でいけそうですが、変換部分のVBでの実装方法が分かりません。
日付計算については
1970/01/01 00:00:00の数値をあらかじめ計算して、引き算してから
>やじゅ 2008/11/04(火) 13:24:06 さんの方法で試してみてください。
union {
double x;
char c[8];
} a;
a.c[0] = 0x00;
a.c[1] = 0x00;
a.c[2] = 0xe1;
a.c[3] = 0x9f;
a.c[4] = 0x37;
a.c[5] = 0xd0;
a.c[6] = 0xcc;
a.c[7] = 0xc2;
TRACE("%lf\n",a.x);
-63361224000000
みなさまありがとうございます。
オショウさんの言われるとおりかもしれませんが、
ある業務用アプリ(特注)がParadoxのデータベースファイルを
使用したアプリになってまして、制作した会社が倒産してサポートを
受けられずしかたなく「自分たちで作ろう」という運びになりました。
ただ、Paradoxが動いているのではなく単にファイル形式として
使用されているだけなので今回のような質問にいたったわけです(^^;
やじゅさん、かんさんありがとうございます。
msというのはなんとなく気づきましたが、8バイトというのは気づきませんでした。
元のファイルには7バイトまでのバイナリしかありません。推測ですが、
秒単位の精度で問題ないためファイルに書き出さず内部で処理していたのかも
しれません。
皆様ありがとうございました。
せめて変換方法位は・・
Declare Sub CopyValtoVal Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal length As Long)
Dim byt(8) As Byte
Dim dbl As Double
byt(0) = &H0
byt(1) = &H0
byt(2) = &HE1
byt(3) = &H9F
byt(4) = &H37
byt(5) = &HD0
byt(6) = &HCC
byt(7) = &HC2
CopyValtoVal dbl, byt(0), 8
Debug.Print dbl
ここの過去ログ凄いですね。
追記
先頭ビットでA.CとB.Cみたいです。
気がつかなかった。