private static byte[] ConstructMessage(object data, TrameId id)
    {
        List <byte> trame = new List <byte>();

        // Ajout de l'ID à la trame
        trame.Add((byte)id);

        // Ajoute une valeur par défaut sur les 4 bytes reservé aux data pour que la structure de la trame soit toujours correcte
        var placeholder = BitConverter.GetBytes((int)data);

        trame.AddRange(placeholder);

        return(trame.ToArray());
    }
    private static byte[] ConstructPath(PointData[] path, TrameId id)
    {
        List <byte> trame = new List <byte>();

        // Ajout de l'ID à la trame
        trame.Add((byte)id);

        // Ajout du nombre de points codé sur 2 bytes
        var pointsCount = (ushort)path.Length;

        trame.AddRange(BitConverter.GetBytes(pointsCount));

        // Ajout de tous les x et y
        // chaque point est composé de 1 x puis 1 y chacun codé sur un double de 8 bytes
        for (int i = 0; i < path.Length; i++)
        {
            trame.AddRange(BitConverter.GetBytes(path[i].Xd));
            trame.AddRange(BitConverter.GetBytes(path[i].Yd));
        }

        return(trame.ToArray());
    }
    public static object Deconstruct(byte[] trame, out TrameId trameId)
    {
        // Valeurs par défaut des objets qui seront envoyés si il y a un problème avec le dechiffrage de la trame
        object result = new object();

        trameId     = TrameId.Null;
        indiceTrame = 0;

        try
        {
            // Lecture du premier byte qui correspond TOUJOURS à l'Id
            byte id = trame[indiceTrame];
            trameId = (TrameId)id;
            indiceTrame++;

            switch (trameId)
            {
            case TrameId.Configuration:
                result = DeconstructConfiguration(trame);
                break;

            case TrameId.Positions:
                result = DeconstructPoint(trame);
                break;

            case TrameId.Positions2:
                result = DeconstructPoint(trame);
                break;

            case TrameId.Forces:
                result = DeconstructPoint(trame);
                break;

            case TrameId.Forces2:
                result = DeconstructPoint(trame);
                break;

            case TrameId.PauseGame:
                result = DeconstructMessage(trame);
                break;

            case TrameId.StopGame:
                result = DeconstructMessage(trame);
                break;

            case TrameId.SetValue:
                result = DeconstructValue(trame);
                break;

            case TrameId.Null:
                break;

            default:
                break;
            }
        }
        catch (Exception)
        {
        }

        return(result);
    }