/// <summary> /// Initializes a new instance of the <see cref="OscTimeTag"/> class. /// </summary> /// <param name="data">The time stamp to use to set the Osc Time Tag.</param> public OscTimeTag(byte[] data) { byte[] secondsSinceEpochData = new byte[4]; Array.Copy(data, 0, secondsSinceEpochData, 0, 4); byte[] fractionalSecondData = new byte[4]; Array.Copy(data, 4, fractionalSecondData, 0, 4); if (BitConverter.IsLittleEndian) { secondsSinceEpochData = OSCPacket.swapEndian(secondsSinceEpochData); fractionalSecondData = OSCPacket.swapEndian(fractionalSecondData); } uint secondsSinceEpoch = BitConverter.ToUInt32(secondsSinceEpochData, 0); uint fractionalSecond = BitConverter.ToUInt32(fractionalSecondData, 0); DateTime timeStamp = Epoch.AddSeconds(secondsSinceEpoch).AddMilliseconds(fractionalSecond); if (!IsValidTime(timeStamp)) { throw new Exception("Not a valid OSC Timetag discovered."); } mTimeStamp = timeStamp; }
/// <summary> /// Convert the Osc Time Tag to a byte array. /// </summary> /// <returns>A byte array containing the Osc Time Tag.</returns> public byte[] ToByteArray() { List <byte> timeStamp = new List <byte>(); byte[] secondsSinceEpoch = BitConverter.GetBytes(SecondsSinceEpoch); byte[] fractionalSecond = BitConverter.GetBytes(FractionalSecond); if (BitConverter.IsLittleEndian) // != OscPacket.LittleEndianByteOrder) { secondsSinceEpoch = OSCPacket.swapEndian(secondsSinceEpoch); fractionalSecond = OSCPacket.swapEndian(fractionalSecond); } timeStamp.AddRange(secondsSinceEpoch); timeStamp.AddRange(fractionalSecond); return(timeStamp.ToArray()); }