人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

秒とマイクロ秒(共に整数)から、NTP の64ビットタイムスタンプフォーマットに変換する方法を教えてください。
C言語のサンプルソースがあればベストですが、具体的な説明でも構いません。

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

●質問者: GigaSlave
●カテゴリ:コンピュータ
✍キーワード:NTP RFC サンプルソース タイムスタンプ ネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● aki73ix
●40ポイント

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

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

http://homepage1.nifty.com/kazubon/diary/ver230.html

TClock日記

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で考えてみると分かりやすいかと思います

◎質問者からの返答

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

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

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

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


2 ● nitscape
●40ポイント

http://www.geocities.jp/heartland_cosmos_2211/rfc2030.html

RFC-2030 日本語訳

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

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

◎質問者からの返答

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ