private void CalcPositionDiskToVirtual(int start, int diskId, out int ret) { ret = -1; int repeatSizeOnDisk = NumDiscs * ChunkSize; int dataSizeOnDisk = (NumDiscs - 1) * ChunkSize; int offsetInChunk = start % ChunkSize; int chunkAdressOnDisk = start - offsetInChunk; // pos in %ChunkSize int chunkOffsetOnDisk = chunkAdressOnDisk % repeatSizeOnDisk; int basePosOnDisk = chunkAdressOnDisk - chunkOffsetOnDisk; int basePos = basePosOnDisk / repeatSizeOnDisk * dataSizeOnDisk * NumDiscs; int inTablePos = DiskPositions[diskId] + NumDiscs * (chunkOffsetOnDisk / ChunkSize); if (Arrangement.Where(o => o.Value == inTablePos).Select(o => o.Key).Any()) { int otherPos = Arrangement.Where(o => o.Value == inTablePos).Select(o => o.Key).First(); ret = basePos + otherPos * ChunkSize + offsetInChunk; } }