public static bool TryParse(byte[] bytes, out EventTransUnit value) { if (bytes[0] == (byte)BytesHeaderType.Event) { var idType = (ActorIdType)bytes[1]; var bytesSpan = bytes.AsSpan(); var eventTypeLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength, sizeof(ushort))); var actorIdBytesLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength + sizeof(ushort), sizeof(ushort))); var baseBytesLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength + (2 * sizeof(ushort)), sizeof(ushort))); var eventBytesLength = BitConverter.ToInt32(bytesSpan.Slice(BytesHeadLength + (3 * sizeof(ushort)), sizeof(int))); var skipLength = BytesHeadLength + (3 * sizeof(ushort)) + sizeof(int); if (idType == ActorIdType.Long) { var actorId = BitConverter.ToInt64(bytesSpan.Slice(skipLength + eventTypeLength, actorIdBytesLength)); value = new EventTransUnit( Encoding.UTF8.GetString(bytesSpan.Slice(skipLength, eventTypeLength)), actorId, bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength, baseBytesLength).ToArray(), bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength + baseBytesLength, eventBytesLength).ToArray()); return(true); } else if (idType == ActorIdType.String) { var actorId = Encoding.UTF8.GetString(bytesSpan.Slice(skipLength + eventTypeLength, actorIdBytesLength)); value = new EventTransUnit( Encoding.UTF8.GetString(bytesSpan.Slice(skipLength, eventTypeLength)), actorId, bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength, baseBytesLength).ToArray(), bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength + baseBytesLength, eventBytesLength).ToArray()); return(true); } else if (idType == ActorIdType.Guid) { var actorId = Encoding.UTF8.GetString(bytesSpan.Slice(skipLength + eventTypeLength, actorIdBytesLength)); value = new EventTransUnit( Encoding.UTF8.GetString(bytesSpan.Slice(skipLength, eventTypeLength)), new Guid(actorId), bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength, baseBytesLength).ToArray(), bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength + baseBytesLength, eventBytesLength).ToArray()); return(true); } } value = default; return(false); }
public static bool TryParseWithNoId(byte[] bytes, out EventTransUnit value) { if (bytes[0] == (byte)BytesHeaderType.Event) { var bytesSpan = bytes.AsSpan(); var eventTypeLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength, sizeof(ushort))); var actorIdBytesLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength + sizeof(ushort), sizeof(ushort))); var baseBytesLength = BitConverter.ToUInt16(bytesSpan.Slice(BytesHeadLength + (2 * sizeof(ushort)), sizeof(ushort))); var eventBytesLength = BitConverter.ToInt32(bytesSpan.Slice(BytesHeadLength + (3 * sizeof(ushort)), sizeof(int))); var skipLength = BytesHeadLength + (3 * sizeof(ushort)) + sizeof(int); value = new EventTransUnit( Encoding.UTF8.GetString(bytesSpan.Slice(skipLength, eventTypeLength)), null, bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength, baseBytesLength), bytesSpan.Slice(skipLength + eventTypeLength + actorIdBytesLength + baseBytesLength, eventBytesLength)); return(true); } value = default; return(false); }