OutOfMemoryException в RNGCryptoServiceProvider.GetBytes ().Как я могу создать огромный случайно сгенерированный файл? - PullRequest
0 голосов
/ 14 февраля 2011

Я хочу создать файл с криптографической последовательностью случайных значений. Это код

int bufferLength = 719585280;
byte[] random = new byte[bufferLength];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random);
File.WriteAllBytes("crypto.bin",random);

Проблема в том, что он возвращает OutOfMemoryException в rng.GetBytes (random) ;. Мне нужен файл такого размера (не больше, не меньше). Как я могу решить это? Спасибо.

Ответы [ 3 ]

5 голосов
/ 14 февраля 2011

Просто сделайте это кусками:

byte[] buffer = new byte[16 * 1024];
int bytesToWrite = 719585280;
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

using (Stream output = File.Create("crypto.bin"))
{
    while (bytesToWrite > 0)
    {
        rng.GetBytes(buffer);
        int bytesThisTime = Math.Min(bytesToWrite, buffer.Length);
        output.Write(buffer, 0, bytesThisTime);
        bytesToWrite -= bytesThisTime;
    }
}

Нет смысла генерировать все это в памяти за один раз.

2 голосов
/ 14 февраля 2011
int fileSize = 719585280;
var bufLength = 4096;
byte[] random = new byte[bufLength];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

var bytesRemaining = fileSize;

using(var fs=File.Create("c:\crypto.bin"))
{
    while(bytesRemaining > 0)
    {
        rng.GetBytes(random);
        var bytesToWrite = Math.Min(bufLength, bytesRemaining);
        fs.Write(random, 0, bytesToWrite);
        bytesRemaining -= bytesToWrite;
    }
}
1 голос
/ 14 февраля 2011

Попробуйте сгенерировать его по частям и объединить в файл.

...