秒とマイクロ秒(共に整数)から、NTP の64ビットタイムスタンプフォーマットに変換する方法を教えてください。

C言語のサンプルソースがあればベストですが、具体的な説明でも構いません。

ネット見たRFC等には、
「64ビット符号無し固定小数点数形式のうち、上位32ビットは秒をそのまま入れ、小数点以下を下位32ビットにいれる。」
と言う説明があるのですが、下位の小数点の実際の変換方法が分かりません。固定小数点の変数なんてありませんし。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/03 17:29:19
  • 終了:--

回答(2件)

id:aki73ix No.1

aki73ix回答回数5224ベストアンサー獲得回数272005/08/03 18:23:14

ポイント40pt

http://www.nakka.com/lib/inet/sntpc.html

Internet Programming - SNTP$B%/%i%$%"%s%H$N:n@.!JF14|7?!K(B

NTPパケットの最後の8バイトに

秒(4バイト)、ミリ秒(4バイト)

がはいりますが、最後のミリ秒については

秒数に、2^32をかけたものを代入します


つまり、

Localtime.wMilliseconds/1000*4294967296;

を代入すればいいわけです


固定小数点形式というのは

例えると4bitの場合は


0000=0

0001=0.0625

0010=0.125

0100=0.25

1000=0.5

1111=0.9375


ということです

これを32Bitで考えてみると分かりやすいかと思います

id:GigaSlave

固定小数点形式の表現方法は知っていますが、

4294967296を掛けるだけでよい、と言うのは知りませんでした。

イマイチ理解できていないので、後で考えてみます。

2番目の日記は良いですね。

2005/08/03 18:35:10
id:nitscape No.2

nitscape回答回数526ベストアンサー獲得回数02005/08/03 18:23:32

ポイント40pt

NTPについてはこのような感じですね。

例えば852秒5625マイクロ秒という数値を64ビット符号無し固定小数点に直すと...

http://www2s.biglobe.ne.jp/~nuts/labo/daal/daal07.html

"B"-con - Laboratory - Data & Algorithm - 固定小数点

にある固定小数点の考え方から、


まず整数部(上位32ビット)は852=0x00000354

小数点部(下位32ビット)は0.5625=2^-1+2^-4=b’10010000000000000000000000000000’=0x90000000

になるかと思います(計算が違っていたらすみません)。プログラム的には効率の悪い方法ですが、ここでは小数点部分を2のx乗で表現しなおして2進数->16進数に変えています。


NTPはビッグエンディアンということですから最終的に2つの数値を組み合わせて

00 00 03 54 90 00 00 00

というバイト列になるのではないでしょうか?

id:GigaSlave

ありがとうございます。これは理解できます。

1ビットずつ計算していくと確実ですが、時間かかりそうですね。

きっちり割り切れない値の処理も面倒ですし。

実際にプログラムで実現するのは確かに効率悪そうです。

普通のNTPのソフトはaki73ixさんの言う方式なのかな…?

2005/08/05 09:10:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません