예제 #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 override long Part2(string input)
    {
        var span   = Parse(input);
        var packet = new BitPacket(span);

        var(_, value) = ProcessPacket(ref packet);
        return(value);
    }
예제 #3
0
    public override long Part1(string input)
    {
        var span   = Parse(input);
        var packet = new BitPacket(span);

        var(version, _) = ProcessPacket(ref packet);
        return(version);
    }
예제 #4
0
        public byte[] GetBytes()
        {
            var result = new BitPacket();

            result.WriteByte(this.Tag);
            result.WriteByte(Length);
            result.WriteBlock(this.Data.ToByteArray(), this.Length * 8);
            return(result.ToByteArray());
        }
예제 #5
0
 public CADescriptor(BitPacket packet)
 {
     this.Tag    = packet.ReadByte();
     this.Length = packet.ReadByte();
     //this.CASystemID = packet.ReadInt(16);
     //packet.SkipBit(3);
     //this.CAPID = packet.ReadInt(13);
     //this.PrivateDataBytes = packet.ReadBlock((this.Length - 4) * 8);
 }
예제 #6
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
        });
    }
예제 #7
0
 public Descriptor(BitPacket packet)
 {
     this.Tag    = packet.ReadByte();
     this.Length = packet.ReadByte();
     this.Data   = new BitPacket(packet.ReadBlock(this.Length * 8));
 }
예제 #8
0
 public CADescriptor(Descriptor descriptor)
 {
     this.Tag    = descriptor.Tag;
     this.Length = descriptor.Tag;
     this.Data   = descriptor.Data;
 }