public byte[] encode(int seq, byte[] cmd) { var msglen = MESSAGE_MIN + cmd.Length; seq = seq & MESSAGE_SEQ_MASK | MESSAGE_DEST; var @out = new List <byte> { (byte)msglen, (byte)seq }; @out.AddRange(cmd); @out.AddRange(BitConverter.GetBytes((short)SerialUtil.Crc16_ccitt(@out.ToArray()))); @out.Add(MESSAGE_SYNC); return(@out.ToArray()); }
public object check_packet(byte[] s) { if (s.Length < MESSAGE_MIN) { return(0); } var msglen = s[MESSAGE_POS_LEN]; if (msglen < MESSAGE_MIN || msglen > MESSAGE_MAX) { return(-1); } var msgseq = s[MESSAGE_POS_SEQ]; if ((msgseq & ~MESSAGE_SEQ_MASK) != MESSAGE_DEST) { return(-1); } if (s.Length < msglen) { // Need more data return(0); } if (s[msglen - MESSAGE_TRAILER_SYNC] != MESSAGE_SYNC) { return(-1); } var msgcrc = BitConverter.ToInt16(s, msglen - MESSAGE_TRAILER_CRC); var crc = SerialUtil.Crc16_ccitt(new ReadOnlySpan <byte>(s, 0, msglen - MESSAGE_TRAILER_SIZE)); if (crc != msgcrc) { logging.Debug("got crc {0} vs {1}", crc, msgcrc); return(-1); } return(msglen); }