public static Result <NtpMessage> ParseFromBytes(byte[] bytes) { if (bytes.Length < MinMessageSizeInBytes || bytes.Length > MaxMessageSizeInBytes) { return(Result.Fail <NtpMessage>("Incorrect input data (should be more than 48 and less than 68)")); } var leapIndicator = (LeapIndicator)((bytes[0] & 0b11000000) >> 6); var versionNumber = (bytes[0] & 0b00111000) >> 3; var mode = bytes[0] & 0b00000111; var stratum = bytes[1]; var pollInterver = bytes[2]; var precision = bytes[3]; var rootDelay = Converter.ToUInt32(bytes, 4); var rootDispersion = Converter.ToUInt32(bytes, 8); var referenceId = Converter.ToUInt32(bytes, 12); var referenceTimestamp = TimeStamp.ReadFromByteArray(bytes, 16); var originateTimestmap = TimeStamp.ReadFromByteArray(bytes, 24); var receiveTimestamp = TimeStamp.ReadFromByteArray(bytes, 32); var transmitTimestamp = TimeStamp.ReadFromByteArray(bytes, 40); var id = bytes.Length > 48 ? Converter.ToUInt32(bytes, 48) : 0; var digest = bytes.Length > 48 ? BitConverter.ToString(bytes, 52) : ""; var result = new NtpMessage { LeapIndicator = leapIndicator, VersionNumber = versionNumber, Mode = mode, Stratum = stratum, PollInterver = pollInterver, Precision = precision, RootDelay = rootDelay, RootDispersion = rootDispersion, ReferenceId = referenceId, ReferenceTimestamp = referenceTimestamp, OriginateTimestmap = originateTimestmap, ReceiveTimestamp = receiveTimestamp, TransmitTimestamp = transmitTimestamp, Id = id, Digest = digest }; return(Result.Ok(result)); }
public static Result <NtpMessage> GenerateReplyFrom(NtpMessage ntpRequest, DateTime currentTime) { var receiveTimestamp = TimeStamp.FromDateTime(currentTime - StartTime); var result = new NtpMessage { LeapIndicator = LeapIndicator.NoWarning, VersionNumber = ntpRequest.VersionNumber, Mode = RequestMode, Stratum = 1, PollInterver = ntpRequest.PollInterver, Precision = 0xe9, RootDelay = 0, RootDispersion = 0, ReferenceId = BitConverter.ToUInt32(Encoding.UTF8.GetBytes("LOCL"), 0), ReceiveTimestamp = receiveTimestamp, OriginateTimestmap = ntpRequest.TransmitTimestamp, ReferenceTimestamp = receiveTimestamp, TransmitTimestamp = receiveTimestamp, Digest = "" }; return(Result.Ok(result)); }