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); }
public BitsPacketParser(string line) { ba = ConvertHexToBitArray(line); root = GetBitsPacket(0); }