Пример #1
0
        private FragmentedPacket[] SplitPacketIntoFragments()
        {
            int normalHeaderSize     = (CRC_SIZE + SEQUENCE_SIZE) / 8;
            int fragmentedHeaderSize = normalHeaderSize +                                                                  // CRC + Sequence
                                       (int)Math.Ceiling((decimal)(FrameSerializer.BitsRequired(0, dFactory.Count() - 1) + // Number of bits required to send the packet type.
                                                                   FragmentedPacket.FRAGMENT_HEADER_SIZE) / 8);            // Fragment ID + Number of fragments
            int         dataSize          = MTU - fragmentedHeaderSize;
            int         nbOfFragments     = (int)Math.Ceiling((FrameSerializer.BitPacking.ByteLength - normalHeaderSize) / (decimal)dataSize);
            Span <byte> data              = FrameSerializer.BitPacking.GetByteSpanBuffer();
            Span <byte> dataWithoutHeader = data.Slice(normalHeaderSize);

            FragmentedPacket[] packets = new FragmentedPacket[nbOfFragments];
            for (int i = 0; i < nbOfFragments; i++)
            {
                FrameSerializer.BitPacking = new BitPacker();
                packets[i]        = new FragmentedPacket();
                packets[i].Header = new PacketHeader(0, CurrentSequence);
                packets[i].Header.BeginSerialize(FrameSerializer);                      // CRC + Sequence
                int id = dFactory.GetID <IPacket>(packets[i]);
                FrameSerializer.Serialize(ref id, 0, dFactory.Count() - 1);             // Packet ID
                packets[i].FragmentID        = i;
                packets[i].NumberOfFragments = nbOfFragments;

                int length = dataSize;
                if (i == nbOfFragments - 1)
                {
                    length = dataWithoutHeader.Length % dataSize;
                }

                packets[i].Data = dataWithoutHeader.Slice(dataSize * i, length).ToArray();
                packets[i].Serialize(FrameSerializer);                                  // Data
                AddCrcOnHeader(packets[i].Header);
            }
            return(packets);
        }
Пример #2
0
        static void Main(string[] args)
        {
            var from = StripQuotes(args[0]);
            var to   = StripQuotes(args[1]);

            var parser  = new FrameParser();
            var romData = parser.Parse(from);

            FrameSerializer.Export(to, romData);
        }
        public List <IPacket> Receive(byte[] pData)
        {
            FrameSerializer.BitPacking = BitPacker.FromArray(pData);
            uint crcValue = FrameSerializer.BitPacking.ReadValue(CrcCheck.HashSize);             // CRC

#if TRACE_LOG
            Log("Read CRC : " + crcValue + " (" + CrcCheck.HashSize + "Bits)");
#endif
            dCrcParameters.Check = crcValue;

            byte[] dataCrcCalculation = FrameSerializer.BitPacking.GetByteBuffer();
            if (CrcCheck.IsRight(dataCrcCalculation))
            {
                CurrentSequence = (ushort)FrameSerializer.BitPacking.ReadValue(SEQUENCE_SIZE);          // Sequence
#if TRACE_LOG
                Log("Read Sequence : " + Sequence + " (" + SEQUENCE_SIZE + "Bits)");
#endif
                Debug.Assert(!Program.StopOnSequence.HasValue || CurrentSequence != Program.StopOnSequence.Value);
                List <IPacket> result = new List <IPacket>();
                int            id     = 0;

                // Read the packets until an error occur or if the BitLenght is less than a byte.
                // This is because when the data are sent they are always rounded at the superior byte and the end of a packet is filled with 0's.
                while (FrameSerializer.BitPacking.BitLength >= 8 && !FrameSerializer.Error)
                {
#if TRACE_LOG
                    Log("Packet ID : ");
#endif
                    FrameSerializer.Serialize(ref id, 0, dFactory.Count() - 1);                  // Packet ID

                    IPacket packet = dFactory.CreateInstance <IPacket>(id);
                    packet.Header = new PacketHeader(crcValue, CurrentSequence);
#if TRACE_LOG
                    Log("Packet Data : ");
#endif
                    if (packet.Serialize(FrameSerializer))                                       // Data
                    {
                        result.Add(packet);
                    }
                }
                return(result);
            }
            else
            {
#if TRACE_LOG
                Log("Refused packet !");
#endif
            }
            return(null);
        }
Пример #4
0
        public bool ProcessPacket(Packet pPacket)
        {
            pPacket.Header = PrepareFrame(_shouldClean);                                            // CRC + Sequence

            Debug.Assert(!Program.StopOnSequence.HasValue || CurrentSequence != Program.StopOnSequence.Value);
            int bitCounter = FrameSerializer.BitPacking.BitLength;
            int id         = dFactory.GetID(pPacket);

#if TRACE_LOG
            Log("Packet ID : ");
#endif
            FrameSerializer.Serialize(ref id, 0, dFactory.Count() - 1);                              // Packet ID
#if TRACE_LOG
            Log("Packet Data : ");
#endif
            if (!pPacket.Serialize(FrameSerializer))                                                 // Data
            {
#if DEBUG
                if (pPacket is PacketB)
#endif
                {
#if DEBUG
                    PacketB p = (PacketB)pPacket;
                    if (p.Actors.Count == 0)
#endif
                    {
                        FrameSerializer.BitPacking.Clear();
                        FrameSerializer.Error = false;
                        return(false);
                    }
                }
            }

            if (FrameSerializer.BitPacking.ByteLength > MTU)
            {
                SplitPacketIntoFragments();
            }
            else
            {
                AddCrcOnHeader(pPacket.Header);
            }

            CurrentSequence++;
            _shouldClean = true;
            return(!FrameSerializer.Error);
        }