获取数组子集,而不像在C中那样使用指针进行复制
本文关键字:指针 复制 子集 数组 获取 | 更新日期: 2023-09-27 18:13:27
我有一个api调用,需要获得byte[]
作为参数,我的数据已经在byte[]
中。问题是我想把这个缓冲区分成小块发送。
缓慢的解决方案是将数组数据复制到新数组中。但我不想这么做,因为复制是不必要的。我只是想要一个byte[]
指针,我可以在我的缓冲区中移动。如在C或c++中…
下面是一个伪代码示例:
ArrayOriginal = { 0, 1, 2, 3, 4, ... 100 }
ArrayFirstChunk = { 0, 1, 2 }
(指向原数组第一个元素的指针)ArraySecondChunk = { 3, 4, 5 }
(指向原始数组中第四个元素的指针)…
这可能吗?数据在存储器中只能使用一次。
thx
您没有说明是否可以更改API。我想没有,但如果可以,总是有IEnumerable<byte>
-所以你返回
myarray.Skip(4).Take(4);
等您可以尝试使用unsafe
来获得指向数组的指针。否则缓冲区。BlockCopy是一种将数组的部分复制到另一个数组的有效方法。如果发送小块数据,您可以重用小数组实例,并将其留给垃圾收集来释放数组中的内存。
可以创建一个包含偏移量和长度的数组。就像这样,你可以使用数组的子数组。但它不会是一个数组
当你传递一个数组作为参数时,你只是传递一个指向该数组的指针。数组在内存中只存储一次。所以,我认为你不需要把它们分成小块。如果你想在块中处理它,我建议只读取所需的元素,首先从0到2,然后从3到5,等等…
希望有帮助
处理数组内数据的通常方法是简单地指定选定的偏移量和计数,例如:
// {0, ..., 100}
byte[] data = Enumerable.Range(0, 101).Select(i => (byte)i).ToArray();
Write(data, 0, 3);
Write(data, 3, 3);
...
static void Write(byte[] buffer, int offset, int count)
{
for(int i = offset ; i < offset + count; i++)
Console.WriteLine(buffer[i]);
Console.WriteLine();
}
你可以用unsafe
(通过byte*
和fixed
)做一些类似于C方法的事情,但我不确定它在这里能买到多少;但是:
fixed(byte* ptr = data)
{
Write(ptr, 3);
Write(ptr + 3, 3);
}
...
static unsafe void Write(byte* ptr, int count)
{
for (int i = 0; i < count; i++)
Console.WriteLine(ptr[i]);
Console.WriteLine();
}
你可以封装一个缓冲区,偏移量和计数,但它不会一个数组-可能不是很有用。