public static (long version, long value) ProcessOperatorPacket(ref BitPacket packet, PacketType type) { var lengthTypeId = packet.ReadNextInt(1); var data = new List <(long version, long value)>(); switch (lengthTypeId) { case 0: var totalLengthAsBits = packet.ReadNextInt(15); var target = packet.GetOffset() + totalLengthAsBits; while (packet.GetOffset() < target) { data.Add(ProcessPacket(ref packet)); } break; case 1: var numberOfSubPackets = packet.ReadNextInt(11); for (int i = 0; i < numberOfSubPackets; i++) { data.Add(ProcessPacket(ref packet)); } break; } var version = data.Aggregate(0L, (acc, next) => acc + next.version); var value = CalculateOperator(data.Select(x => x.value).ToList(), type); return(version, value); }
public static (long version, long value) ProcessPacket(ref BitPacket packet) { var version = packet.ReadNextInt(3); var typeId = packet.ReadNextEnum <PacketType>(3); (long version, long value)data = typeId switch { PacketType.Literal => ProcessLiteralPacket(ref packet), _ => ProcessOperatorPacket(ref packet, typeId), }; return(data with { version = data.version + version }); }