【问题标题】:Convert NTP Short Format to Seconds将 NTP 短格式转换为秒
【发布时间】:2020-01-16 14:05:33
【问题描述】:

我正在尝试将 RFC 5905 NTP Short Format 转换为秒。 NTP 短格式是一个 uint32_t,前 16 位是秒(即秒 = 格式 >> 16),其他 16 位是秒的分数(即分数 = 格式和 0xFFFF)。转换后,我希望输出为双精度。

【问题讨论】:

  • 一定要考虑字节序。 NTP 格式是大端,而许多机器(尤其是 x86 和 x64 处理器)是小端。
  • @FredLarson 谢谢,这已经被处理好了:)

标签: c network-programming ntp


【解决方案1】:

此答案取自 Google 群聊。希望对你有帮助:
将其视为 32 位小数,二进制点在左侧, 乘以一百万,保留整数部分。

microsecs = ((unsigned long long) frac * 1000000) >> 32;

四舍五入(最多可以四舍五入1000000),

microsecs = ((unsigned long long) frac * 1000000 + (1LL<<31)) >> 32;

【讨论】:

  • “二进制点在左边”是什么意思?分数本身是一个 uint16_t。所以“frac”只是作为 uint32_t 的分数?
【解决方案2】:

TS_short 是 uint32_t RFC 5905 NTP 短格式,以下会将其转换为双精度秒:

double secs = (double)(TS_short >> 16) + (double)(TS_short & 0xFFFF) / (double)(1LL << 16);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2020-12-13
    • 2011-04-09
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多