internal Piece(byte[] data, byte[] id, uint rounds) { Data = data; ID = id; RedundancyIndex = rounds; OriginalID = HashSingleton.Compute(Data); OurResponsibility = true; }
public static (FileDescriptor, List <byte[]>) FromFile(Stream file, string name, int chunk_size = 65000) { var pieces = new List <byte[]>(); var hasher = HashSingleton.Duplicate(); var descriptor = new FileDescriptor() { Name = name, Length = file.Length, Created = DateTime.UtcNow, Checksum = new byte[hasher.HashSize / 8], PieceIdentifiers = new List <byte[]>(), MimeType = MimeMapper.MapToMime(name) }; byte[] buffer = new byte[chunk_size]; while (file.Position < file.Length) { var read = file.Read(buffer, 0, chunk_size); var chunk = new byte[read]; Array.Copy(buffer, 0, chunk, 0, read); if (file.Position == file.Length) { hasher.TransformFinalBlock(buffer, 0, read); } else { hasher.TransformBlock(buffer, 0, read, buffer, 0); } pieces.Add(chunk); descriptor.PieceIdentifiers.Add(HashSingleton.Compute(chunk)); } descriptor.Checksum = hasher.Hash; return(descriptor, pieces); }