获取数组子集,而不像在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

获取数组子集,而不像在C中那样使用指针进行复制

您没有说明是否可以更改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();
}

你可以封装一个缓冲区,偏移量和计数,但它不会一个数组-可能不是很有用。