public byte[] GetBytes(ButtonMessage message) { //set the sequence message.SequenceID = (byte)_sequenceID++; //set checksum message.Checksum = CalculateChecksum(message); return(ConvertToByte(message)); }
ushort CalculateChecksum(ButtonMessage message) { //payload_len: The actual length of the packet //subtracting 2 here, to remove checksum from len //else we will end up computing checksum of the checksum ushort checksum = 0; checksum += (ushort)message.PacketID; checksum += (ushort)message.ErrorID; foreach (var d in message.Payload) { checksum += (ushort)d; } return(checksum); }
ButtonMessage ParseMessage() { var result = new ButtonMessage(); int index = 0; result.StartOfFrame = packet_buffer[index++]; if (result.StartOfFrame != SOP) { return(null); //Invalid SOP } result.PacketID = packet_buffer[index++]; result.ErrorID = packet_buffer[index++]; result.SequenceID = packet_buffer[index++]; int index2 = 0; result.Payload = new byte[packet_size - index - 3]; for (; index < packet_size - 3; index++) { result.Payload[index2++] = packet_buffer[index]; } result.EndOfFrame = packet_buffer[index + 2]; if (result.EndOfFrame != EOP) { return(null); //Invalid EOP } //correct checksum (to big endian) result.Checksum = BitConverter.ToUInt16(new byte[] { packet_buffer[index + 1], packet_buffer[index] }, 0); //verify checksum var check = CalculateChecksum(result); if (check != result.Checksum) { return(null); //Invalid Checksum } return(result); }
Byte[] ConvertToByte(ButtonMessage message) { var index = 0; var result = new byte[message.Payload.Length + 7]; result[index++] = message.StartOfFrame; result[index++] = message.PacketID; result[index++] = message.ErrorID; result[index++] = message.SequenceID; foreach (var data in message.Payload) { result[index++] = data; } var checksum = BitConverter.GetBytes(message.Checksum); result[index++] = checksum[1]; result[index++] = checksum[0]; result[index++] = message.EndOfFrame; return(result); }