public static int Read(byte[] buf, int c, RaceStatus stat)
        {
            stat.MessageVersionNumber = buf[c++];

            var t = new byte[] { buf[c++], buf[c++], buf[c++], buf[c++], buf[c++], buf[c++], 0, 0 };
            stat.CurrentTime = new DateTime(1970, 1, 1).AddMilliseconds(BitConverter.ToUInt64(t, 0));

            stat.RaceId = BitConverter.ToUInt32(buf, c);
            c += 4;

            stat.Status = (RaceStatusEnum)buf[c++];

            stat.ExpectedStartTime = new DateTime(1970, 1, 1).AddMilliseconds(BitConverter.ToUInt64(
                new byte[] { buf[c++], buf[c++], buf[c++], buf[c++], buf[c++], buf[c++], 0, 0 }, 0));

            stat.RaceCourseWindDirection = BitConverter.ToInt16(buf, c) * 360.0 / 65536.0;
            c += 2;

            stat.RaceCourseWindSpeed = BitConverter.ToUInt16(buf, c) / 1000.0;
            c += 2;

            stat.NumberOfBoatsInRace = buf[c++];
            stat.RaceType = (RaceTypeEnum)buf[c++];

            for (int i = 0; i < stat.NumberOfBoatsInRace; ++i)
            {
                var b = new BoatStatus();
                c = BoatStatus.Read(buf, c, b);
                stat.BoatStatuses.Add(b);
            }

            return c;
        }
 public static RaceStatus Read(byte[] buf)
 {
     var rs = new RaceStatus();
     Read(buf, 0, rs);
     return rs;
 }