Как добавить ноль в ByteArray? - PullRequest
0 голосов
/ 20 января 2012

Я пишу поток, который должен быть выровнен по определенному размеру.Как правильно добавить ноль (или любое значение), не подвергая уязвимые области оперативной памяти вне Array.Copy?

Например, мне нужно «округлить» byteArray.Length до значения pad:

 byte[] byteArray = Encoding.ASCII.GetBytes(preStream);
 long pad = (minBlobEntrySize * databaseCount) - byteArray.Length;
 Array.Copy(byteArray, 0, buffer, relativeOffset2, byteArray.Length);

И я знаю, что следующее неверно, поскольку оно может раскрыть конфиденциальные данные:

  Array.Copy(byteArray, 0, buffer, relativeOffset2, byteArray.Length + pad);

Как правильно обращаться с этим?

Ответы [ 4 ]

1 голос
/ 20 января 2012

Массивы типов значений в C # автоматически инициализируются для всех нулей (я знаю документацию, которую я связал, чтобы сказать "числовые" типы, но это означает типы значений) Если это свежий массив, вам не нужно делать ничего особенного. В этом случае это означает, что вы всегда объявляете массив с правильным размером и копируете в него поток:

byte[] buffer = Encoding.ASCII.GetBytes(preStream);
byte[] byteArray = new byte[Math.Min(minBlobEntrySize * databaseCount, buffer.Length)]; 
Array.Copy(buffer, byteArray, buffer.Length);
1 голос
/ 20 января 2012

Похоже, что метод Array.Resize должен делать то, что вы хотите здесь.

byte[] byteArray = Encoding.ASCII.GetBytes(preStream);
long pad = (minBlobEntrySize * databaseCount) - byteArray.Length;
Array.Resize(ref byteArray, byteArray.Length + pad);
Array.Copy(byteArray, 0, buffer, relativeOffset2, byteArray.Length);

Обратите внимание, что вам не нужен + pad в методе Copy, так как длина будет изменена.один.

0 голосов
/ 20 января 2012

Не уверен, что вы подразумеваете под раскрытием конфиденциальных данных, но я бы просто записал в поток напрямую.

long alignedLength = minBlobEntrySize * databaseCount;
while (stream.Length < alignedLength)
{
    stream.WriteByte(0);
}
0 голосов
/ 20 января 2012
byte[] buffer = new byte[byteArray.Length + pad];

это то, что вы ищете?Другие байты будут равны нулю.

Редактировать

Если вы используете буфер для предыдущих значений (как я полагаю, исходя из значенияlativeOffset2), вы можете сделать это, возможно:1007 *

или вы можете просто использовать

for(int i=0; i< pad; i++)
    buffer[relativeOffset2 + byteArray.Length + i] = 0;

Я предполагаю, что ваш буфер имеет достаточный размер конечно.

...