Ntp客户端

function parseMsg (buffer) {
    if (buffer.length !== 48) return;
    const pkt = {},
        now = new Date().getTime();
    pkt.leapIndicator = buffer[0] >> 6;
    pkt.version = (buffer[0] & 0x38) >> 3;
    pkt.mode = buffer[0] & 0x7;

    pkt.stratum = buffer[1];
    pkt.interval = Math.pow(2, buffer[2]);
    pkt.precision = Math.pow(2, buffer[3]) * 1000;
    pkt.rootDelay = 1000 * ((256 * (256 * (256 * buffer[4] + buffer[5]) + buffer[6]) + buffer[7]) / 0x10000);
    pkt.rootDispersion = ((buffer[8] << 8) + buffer[9] + ((buffer[10] << 8) + buffer[11]) / Math.pow(2, 16)) * 1000;
    pkt.referenceId = pkt.stratum < 2 ? String.fromCharCode(buffer[12]) + String.fromCharCode(buffer[13]) + String.fromCharCode(buffer[14]) + String.fromCharCode(buffer[15]) : pkt.stratum < 16 ? `${buffer[12]}.${buffer[13]}.${buffer[14]}.${buffer[15]}` : '';
    pkt.referenceTimestamp = toMsecs(buffer, 16);
    pkt.originateTimestamp = toMsecs(buffer, 24);
    pkt.receiveTimestamp = toMsecs(buffer, 32);
    pkt.transmitTimestamp = toMsecs(buffer, 40);

    pkt.time = pkt.originateTimestamp;
    pkt.delay = ((now - pkt.originateTimestamp) - (pkt.transmitTimestamp - pkt.receiveTimestamp)).toFixed(3) / 1;
    pkt.offset = (((pkt.receiveTimestamp - pkt.originateTimestamp) + (pkt.transmitTimestamp - now)) / 2).toFixed(3) / 1;
    return pkt;
}
function toMsecs(buffer, offset) {
    let seconds = 0, fraction = 0;
    for (let i = 0; i < 4; i++) {
        seconds = (seconds * 256) + buffer[offset + i];
    }
    for (let i = 4; i < 8; i++) {
        fraction = (fraction * 256) + buffer[offset + i];
    }
    return (seconds - 2208988800 + (fraction / Math.pow(2, 32))) * 1000;
}

转载于:https://www.cnblogs.com/zh33gl/p/10795298.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值