我正在编写一个需要与特定大小对齐的流。在不将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);
处理此问题的正确方法是什么?
答案 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);
}