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