private static Item BufferedDecodeItem(byte[] bytes, ref int index) { byte formatCodeValue = bytes[index]; var format = (SecsFormat)(formatCodeValue & 0b_111111_00); byte lengthBits = (byte)(formatCodeValue & 0b_000000_11); index++; byte[] itemLengthBytes = new byte[4]; Array.Copy(bytes, index, itemLengthBytes, 0, lengthBits); Array.Reverse(itemLengthBytes, 0, lengthBits); int dataLength = BitConverter.ToInt32(itemLengthBytes, 0); // max to 3 byte dataLength index += lengthBits; if (format == SecsFormat.List) { if (dataLength == 0) { return(Item.L()); } var list = new List <Item>(dataLength); for (int i = 0; i < dataLength; i++) { list.Add(StreamDecoder.BufferedDecodeItem(bytes, ref index)); } return(Item.L(list)); } var item = Item.BytesDecode(format, bytes, index, dataLength); index += dataLength; return(item); }
private void parseMessage(byte[] bytes, int length, bool isMessageComplelte = false) { if (isMessageComplelte == true) { } else { if (length == 14 && isHeader == true) { //it is a header isHeader = false; Array.Copy(bytes, messageBytes, length); byte[] messageLengths = new byte[4]; Array.Copy(bytes, 0, messageLengths, 0, 4); Array.Reverse(messageLengths, 0, 4); _messageDataLength = (int)BitConverter.ToUInt32(messageLengths, 0); MsgHeader = MessageHeader.Decode(bytes, 4); } else { isHeader = true; if (_messageDataLength - 10 == length) { //it is the message int index = 0; Item item = decoder.BufferedDecodeItem(bytes, ref index); Msg = new SecsMessage(MsgHeader.S, MsgHeader.F, MsgHeader.ReplyExpected, "", item); SecsDataReceivedEventArgs arg = new SecsDataReceivedEventArgs(Msg, SCESEquipment); DataReceived(SocketClient, arg); } } } }
/// <summary> /// Decoder step 1: get message header 10 bytes /// </summary> /// <param name="length"></param> /// <param name="need"></param> /// <returns>The decoder step to execute next.</returns> private int DecoderStep1GetMessageHeader(ref int length, out int need) { if (!StreamDecoder.CheckAvailable(length, 10, out need)) { return(1); } this.messageHeader = MessageHeader.Decode(new ReadOnlySpan <byte>(this.Buffer, this.decodeIndex, 10)); this.decodeIndex += 10; this.messageDataLength -= 10; length -= 10; if (this.messageDataLength == 0) { if (this.messageHeader.MessageType == MessageType.DataMessage) { this.dataMessageHandler(this.messageHeader, new SecsMessage(this.messageHeader.S, this.messageHeader.F, string.Empty, replyExpected: this.messageHeader.ReplyExpected)); } else { this.controlMessageHandler(this.messageHeader); } return(0); } if (length >= this.messageDataLength) { Trace.WriteLine("Get Complete Data Message with total data"); this.dataMessageHandler(this.messageHeader, new SecsMessage(this.messageHeader.S, this.messageHeader.F, string.Empty, StreamDecoder.BufferedDecodeItem(this.Buffer, ref this.decodeIndex), this.messageHeader.ReplyExpected)); length -= (int)this.messageDataLength; this.messageDataLength = 0; return(0); //completeWith message received } return(this.DecoderStep2GetItemHeader(ref length, out need)); }