public static FrameIHeader Read(ReadOnlySpan <byte> buffer, int apduLength) { var sendSeqNo = (ushort)Bytes.GetNFromBytes(buffer[0], buffer[1]); var recieveSeqNo = (ushort)Bytes.GetNFromBytes(buffer[2], buffer[3]); var bAsduTypeId = buffer[4]; var asduTypeId = Enum.IsDefined(typeof(AsduTypeId), bAsduTypeId) ? (AsduTypeId)bAsduTypeId : AsduTypeId.Unknown; var(isSequence, infoObjectsCount) = ReadByte7(buffer[5]); var(isTest, isNegative, cot) = ReadByte8(buffer[6]); var org = buffer[7]; var ushortLE = new UshortLittleEndian { LSB = buffer[8], MSB = buffer[9] }; var ca = ushortLE.V; return(new FrameIHeader(sendSeqNo, recieveSeqNo, asduTypeId, isSequence, isTest, isNegative, cot, org, ca, infoObjectsCount, apduLength)); }
public int TryWrite(Span <byte> buffer) { // :0 start byte buffer[0] = Constants.StartByte; // :1 length of APDU buffer[1] = (byte)ApduLength; // APCI (4 bytes) var(b2, b3) = Bytes.GetBytesFromN(SendSeqNo); var(b4, b5) = Bytes.GetBytesFromN(RecieveSeqNo); buffer[2] = b2; buffer[3] = b3; buffer[4] = b4; buffer[5] = b5; // ASDU // :6 type identification buffer[6] = (byte)AsduTypeId; // :7 SQ | number of information objects buffer[7] = CreateByte7(IsSequence, InfoObjectsCount); // :8 T | P/N | COT buffer[8] = CreateByte8(IsTest, IsNegativeConfirmation, CauseOfTransmission); // :9 ORG buffer[9] = OriginatorAddress; // :10-11 CA (2 bytes) var ca = new UshortLittleEndian { V = CommonAddress }; buffer[10] = ca.LSB; buffer[11] = ca.MSB; return(Constants.FrameIHeaderLength); }