public static IMemoryOwner <byte> TranslateToMemory(S7UserDataDatagram datagram, out int memoryLength) { var offset = datagram.Header.GetHeaderSize() + datagram.Parameter.GetParamSize(); var dataSize = offset + datagram.Data.GetUserDataLength(); var result = S7HeaderDatagram.TranslateToMemory(datagram.Header, dataSize, out memoryLength); var mem = result.Memory.Slice(0, memoryLength); S7UserDataParameter.TranslateToMemory(datagram.Parameter, mem.Slice(datagram.Header.GetHeaderSize())); mem.Span[offset++] = datagram.Data.ReturnCode; mem.Span[offset++] = datagram.Data.TransportSize; BinaryPrimitives.WriteUInt16BigEndian(mem.Slice(offset, 2).Span, datagram.Data.UserDataLength); datagram.Data.Data.CopyTo(mem.Slice(offset + 2, datagram.Data.UserDataLength)); return(result); }
public static S7UserDataDatagram TranslateFromMemory(Memory <byte> data) { var span = data.Span; var result = new S7UserDataDatagram { Header = S7HeaderDatagram.TranslateFromMemory(data), Data = new S7UserData() }; result.Parameter = S7UserDataParameter.TranslateFromMemory(data.Slice(result.Header.GetHeaderSize())); var offset = result.Header.GetHeaderSize() + result.Parameter.GetParamSize(); result.Data.ReturnCode = span[offset++]; result.Data.TransportSize = span[offset++]; result.Data.UserDataLength = BinaryPrimitives.ReadUInt16BigEndian(span.Slice(offset, 2)); offset += 2; result.Data.Data = new byte[result.Data.UserDataLength]; data.Slice(offset, result.Data.UserDataLength).CopyTo(result.Data.Data); return(result); }