Ejemplo n.º 1
0
        public BitsPacket GetBitsPacket(int position)
        {
            var result = new BitsPacket();

            var posVersion = position;
            var posId      = posVersion + 3;
            var posData    = posId + 3;

            result.Version  = 0;
            result.Version |= Convert.ToByte(ba[posVersion]) << 2;
            result.Version |= Convert.ToByte(ba[posVersion + 1]) << 1;
            result.Version |= Convert.ToByte(ba[posVersion + 2]) << 0;

            result.ID  = 0;
            result.ID |= Convert.ToByte(ba[posId]) << 2;
            result.ID |= Convert.ToByte(ba[posId + 1]) << 1;
            result.ID |= Convert.ToByte(ba[posId + 2]) << 0;

            result.LiteralNumber = 0;
            result.Operator      = 0;
            if (result.ID == 4) // Literal number
            {
                int posDataFirstBit = posData;
                int increment       = -1;
                do
                {
                    increment++;
                    if (increment > 0)
                    {
                        posDataFirstBit     += 5;
                        result.LiteralNumber = result.LiteralNumber << 4;
                    }

                    result.LiteralNumber |= Convert.ToByte(ba[posDataFirstBit + 1]) << 3;
                    result.LiteralNumber |= Convert.ToByte(ba[posDataFirstBit + 2]) << 2;
                    result.LiteralNumber |= Convert.ToByte(ba[posDataFirstBit + 3]) << 1;
                    result.LiteralNumber |= Convert.ToByte(ba[posDataFirstBit + 4]) << 0;
                }while (ba[posDataFirstBit]);



                result.NextPos = posDataFirstBit + 5;
            }
            else //Operator
            {
                result.LengthTypeID |= ba[posData];

                if (result.LengthTypeID)
                {
                    result.NumberOfSubpackets  = 0;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 1]) << 10;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 2]) << 9;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 3]) << 8;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 4]) << 7;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 5]) << 6;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 6]) << 5;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 7]) << 4;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 8]) << 3;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 9]) << 2;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 10]) << 1;
                    result.NumberOfSubpackets |= Convert.ToByte(ba[posData + 11]) << 0;

                    int nextPos = posData + 1 + 11;
                    for (int i = 1; i <= result.NumberOfSubpackets; i++)
                    {
                        var subPacket = GetBitsPacket(nextPos);
                        nextPos = subPacket.NextPos;

                        result.subPackets.Add(subPacket);
                    }
                    result.NextPos = result.subPackets.Last().NextPos;
                }
                else
                {
                    result.TotalLengthDataBits  = 0;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 1]) << 14;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 2]) << 13;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 3]) << 12;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 4]) << 11;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 5]) << 10;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 6]) << 9;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 7]) << 8;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 8]) << 7;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 9]) << 6;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 10]) << 5;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 11]) << 4;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 12]) << 3;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 13]) << 2;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 14]) << 1;
                    result.TotalLengthDataBits |= Convert.ToByte(ba[posData + 15]) << 0;

                    int currentPos = posData + 1 + 15;
                    int maxPos     = posData + 1 + 15 + result.TotalLengthDataBits;
                    while (currentPos < maxPos)
                    {
                        var subPacket = GetBitsPacket(currentPos);
                        currentPos = subPacket.NextPos;
                        result.subPackets.Add(subPacket);
                    }

                    result.NextPos = result.subPackets.LastOrDefault()?.NextPos
                                     ?? (currentPos);
                }
            }

            return(result);
        }
Ejemplo n.º 2
0
 public BitsPacketParser(string line)
 {
     ba   = ConvertHexToBitArray(line);
     root = GetBitsPacket(0);
 }