如果有人传递给我一个ArraySegment<byte> foo并且该段指向一个更大的缓冲区,那么将此段复制到一个新的缓冲区中的惯用方法是什么byte[]?
我尝试访问 atfoo.Array但这似乎指向较大缓冲区的开头,而不是段的开头。
例如,较大的缓冲区可能是“blahfoobar”,ArraySegment 指向“foo”。我想得到一个byte[]只有“foo”的。
我确信它非常简单,但是来自 C++,我无法理解 C# 中使用的术语。
using System;
using System.Text;
namespace ConsoleApp1
{
class Program
{
private static readonly byte[] _initArray = Encoding.ASCII.GetBytes("blahfoobar");
//private static byte[] ArraySegmentToArray(ArraySegment<byte> segment)
//{
// var result = new byte[segment.Count];
// for (int i = 0; i < segment.Count; i++)
// {
// result[i] = segment.Array[i + segment.Offset];
// }
// return result;
//}
private static byte[] ArraySegmentToArray(ArraySegment<byte> segment) =>
segment.ToArray();
static void Main(string[] args)
{
var segFoo = new ArraySegment<byte>(_initArray, 4, 3);
var test = ArraySegmentToArray(segFoo);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这当然是不好的做法。因为如果将段转换为数组,则会分配内存,而如果使用 ArraySegment 的东西作为指针,则不会分配内存,实际上,这是使用 ArraySegment 的主要思想,因为如果不是,则可以将数组作为参数提供:) PS 注释代码只是为了理解这个想法。