public override void GetNonZeroBytes(byte[] data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
int offset = 0;
while (offset < data.Length)
{
// Fill the remaining portion of the array with random bytes.
GetBytesInternal(data, offset, data.Length - offset);
// Find the first zero in the remaining portion.
int indexOfFirst0Byte = data.Length;
for (int i = offset; i < data.Length; i++)
{
if (data[i] == 0)
{
indexOfFirst0Byte = i;
break;
}
}
// If there were any zeros, shift down all non-zeros.
for (int i = indexOfFirst0Byte + 1; i < data.Length; i++)
{
if (data[i] != 0)
{
data[indexOfFirst0Byte++] = data[i];
}
}
// Request new random bytes if necessary; dont re-use
// existing bytes since they were shifted down.
offset = indexOfFirst0Byte;
}
}