private bool ParseBitfield(PeerEventData peerEventData) { var byteBitsList = peerEventData.Payload.Select(b => new BitArray(new byte[] { b })); if (byteBitsList.Count() * 8 < PieceAmount - 1) { return(false); } long pieceIndex = 0; foreach (var byteBits in byteBitsList) { for (int byteIndex = 7; byteIndex >= 0; byteIndex--) { if (pieceIndex >= PieceAmount && byteBits[byteIndex]) //Extra bits must be 0 { return(false); } if (byteBits[byteIndex]) { PieceIndexes.Add(pieceIndex); } pieceIndex++; } } return(true); }
public long?RetrievePieceIndexIfAny(List <long> neededPieces) { if (!neededPieces.Any()) { return(null); } if (!PieceIndexes.Any()) { return(null); } var intersection = PieceIndexes.Intersect(neededPieces).ToList(); if (!intersection.Any()) { return(null); } return(intersection.First()); }