CalcCRC() public static method

public static CalcCRC ( byte packet, int length ) : short
packet byte
length int
return short
Exemplo n.º 1
0
        public EventMessage(byte[] msgPacket)
        {
            short msgCRC;
            short expectedCRC;

            if (msgPacket == null)
            {
                throw new ArgumentNullException("msgPacket");
            }

            byte head = msgPacket[VSCP_POS_HEAD];

            _ignoreCRC = ((head & VSCP_NO_CRC_CALC) == VSCP_NO_CRC_CALC);
            _ignoreCRC = true;

            int   incomming_packet_length = msgPacket.Length;
            short dataSize = EventHelper.GetDataSize(msgPacket);

            int msgLength = msgPacket.Length + VSCP_HEADER_SIZE;

            msgLength += (_ignoreCRC) ? 0 : VSCP_SIZE_CRC;

            if (msgLength > VSCP_MAX_DATA_SIZE)
            {
                throw new ApplicationException(string.Format("Invalid event message length: {0}", msgLength));
            }

            _priority = (EVENT_PRIORITY)(head >> 5);

            if (_ignoreCRC == false)
            {
                msgCRC      = EventHelper.GetCRC(msgPacket);
                expectedCRC = EventHelper.CalcCRC(msgPacket, msgLength - VSCP_SIZE_CRC);

                if (msgCRC != expectedCRC)
                {
                    throw new ApplicationException(string.Format("Invalid event message CRC '{0}' instead of {1}", msgCRC, expectedCRC));
                }
            }

            _event = EventHelper.GetEventCode(msgPacket);

            _address = new byte [EventMessage.VSCP_SIZE_ADDRESS];
            Buffer.BlockCopy(msgPacket, VSCP_POS_ADDRESS, _address, 0, VSCP_SIZE_ADDRESS);

            _data = new Byte [dataSize];
            Buffer.BlockCopy(msgPacket, VSCP_POS_DATA, _data, 0, dataSize);
        }
Exemplo n.º 2
0
        public Byte[] GetBytes()
        {
            short crc;

            Byte[] packet;

            packet = new Byte[this.Length];

            // Head
            packet[VSCP_POS_HEAD] = this.HeadByte;

            // Event Class and Type
            Buffer.BlockCopy(
                BitConverter.GetBytes(IPAddress.HostToNetworkOrder(this.EventClass)),
                0, packet,
                EventMessage.VSCP_POS_CLASS,
                EventMessage.VSCP_SIZE_CLASS);

            Buffer.BlockCopy(
                BitConverter.GetBytes(IPAddress.HostToNetworkOrder(this.EventType)),
                0, packet,
                EventMessage.VSCP_POS_TYPE,
                EventMessage.VSCP_SIZE_TYPE);


            // Address
            Buffer.BlockCopy(this.AddressBytes, 0, packet, VSCP_POS_ADDRESS, VSCP_SIZE_ADDRESS);

            // Data Size
            Buffer.BlockCopy(this.DataSizeBytes, 0, packet, VSCP_POS_DATA_SIZE, VSCP_SIZE_DATA_SIZE);

            // Data - limited to 512-25=487 bytes
            Buffer.BlockCopy(this.DataBytes, 0, packet, VSCP_POS_DATA, this.DataSize);

            if (!_ignoreCRC)
            {
                crc = EventHelper.CalcCRC(packet, packet.Length - VSCP_SIZE_CRC);
                Buffer.BlockCopy(
                    BitConverter.GetBytes(IPAddress.HostToNetworkOrder(crc)),
                    0, packet, packet.Length - VSCP_SIZE_CRC, VSCP_SIZE_CRC);
            }

            return(packet);
        }