예제 #1
0
    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);
    }
예제 #2
0
    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
        });
    }