如何将null附加到ByteArray?

时间:2012-01-20 16:46:53

标签: c# arrays bytearray

我正在编写一个需要与特定大小对齐的流。在不将Array的敏感区域暴露在Array.Copy之外的情况下,附加null(或任何值)的正确方法是什么?

例如,我需要将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 个答案:

答案 0 :(得分:1)

C#中的值类型数组是automatically initialized to all zeros(我知道我链接的文档说“数字”类型,但它意味着值类型)。如果这是一个新阵列,你不必做任何特别的事情。在这种情况下,这意味着始终使用适当的大小声明您的数组,并将流复制到它:

byte[] buffer = Encoding.ASCII.GetBytes(preStream);
byte[] byteArray = new byte[Math.Min(minBlobEntrySize * databaseCount, buffer.Length)]; 
Array.Copy(buffer, byteArray, buffer.Length);

答案 1 :(得分:1)

看起来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,因为长度将是已调整大小的长度。

答案 2 :(得分:0)

byte[] buffer = new byte[byteArray.Length + pad];

这是你要找的?其他字节将为零。

修改

如果你正在使用缓冲区作为以前的值(正如我根据relativeOffset2值所假设的那样),你可以这样做:

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

 byte[] padBuff = new byte[pad]; //will be zeros...
 Array.Copy(padBuff, 0, buffer, relativeOffset2 + byteArray.Length, pad);

或者你可以使用

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

我认为你的缓冲区足够大。

答案 3 :(得分:0)

不确定暴露敏感数据的含义,但我只是直接写入流。

long alignedLength = minBlobEntrySize * databaseCount;
while (stream.Length < alignedLength)
{
    stream.WriteByte(0);
}