如何从 ArraySegment 获取字节数组

Jef*_*ica 5 c#

如果有人传递给我一个ArraySegment<byte> foo并且该段指向一个更大的缓冲区,那么将此段复制到一个新的缓冲区中的惯用方法是什么byte[]

我尝试访问 atfoo.Array但这似乎指向较大缓冲区的开头,而不是段的开头。

例如,较大的缓冲区可能是“blahfoobar”,ArraySegment 指向“foo”。我想得到一个byte[]只有“foo”的。

我确信它非常简单,但是来自 C++,我无法理解 C# 中使用的术语。

Iva*_*rin 1

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 注释代码只是为了理解这个想法。

  • @Jeffrey OP 请求“进入一个新的字节[]?” 这段代码确实做到了这一点。不知道为什么你认为它应该做其他事情...如何在不为其分配新空间的情况下创建新数组?即使在你声称知道的 C++ 中,它也不会那样工作...... (2认同)