C# 从现有字节数组c的一部分初始化字节数组#

C# 从现有字节数组c的一部分初始化字节数组#,c#,.net,C#,.net,是否有一种简单的方法可以从现有字节数组的一部分初始化字节数组。在C语言中,可以使用指针来表示like char s[10] = new char[10]; char* b = s + 5; 是否可以在c#中这样做,例如: 这是可能的,但需要不安全的代码: unsafe { byte[] b = new byte[buffersize]; fixed(byte* bStart = b) { byte* header = bStart + 5;

是否有一种简单的方法可以从现有字节数组的一部分初始化字节数组。在C语言中,可以使用指针来表示like

char s[10] = new char[10];
char* b = s + 5;
是否可以在c#中这样做,例如:


这是可能的,但需要不安全的代码:

unsafe 
{
    byte[] b = new byte[buffersize];
    fixed(byte* bStart = b)
    {
       byte* header = bStart + 5;
       byte* data = bStart + 25;
    }
}

这就是说,除非在C#中绝对必要,否则通常都会避免这种情况。使用不安全的代码不是规范,因为正如建议的那样,它是不安全的。这种类型的代码可能会导致许多错误,因此最好重新考虑设计。

这是可能的,但它需要不安全的代码:

unsafe 
{
    byte[] b = new byte[buffersize];
    fixed(byte* bStart = b)
    {
       byte* header = bStart + 5;
       byte* data = bStart + 25;
    }
}
var arrOld = new byte[] { 0, 1, 2, 3, 5 };

int buffersize = 10;
var arrNew = new byte[buffersize];
Array.Copy(arrOld, arrNew, arrOld.Length);

这就是说,除非在C#中绝对必要,否则通常都会避免这种情况。使用不安全的代码不是规范,因为正如建议的那样,它是不安全的。这种类型的代码可能会导致许多错误,因此最好重新考虑设计。

您需要在C#中使用不安全代码,这要求您在生成设置中选中“允许不安全代码”选项

var arrOld = new byte[] { 0, 1, 2, 3, 5 };

int buffersize = 10;
var arrNew = new byte[buffersize];
Array.Copy(arrOld, arrNew, arrOld.Length);
unsafe
{
  byte[] b = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  fixed (byte* pStart = b)
  {
    byte* pHeader = pStart + 2;
    byte* pData = pStart + 5;
  }
}

您需要在C#中使用不安全代码,这要求您在生成设置中选中“允许不安全代码”选项

unsafe
{
  byte[] b = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  fixed (byte* pStart = b)
  {
    byte* pHeader = pStart + 2;
    byte* pData = pStart + 5;
  }
}
当然有

int[] myArray = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] subArray = myArray.Skip(5).ToArray();
性能特征与您的C示例非常不同,但是它们并不可怕。如果您在寻找性能,而不是像上面那样使用不安全,请使用相同的数组并从列表中所需的点开始迭代,或者使用array.Copy,如其他地方所示。

当然有

int[] myArray = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] subArray = myArray.Skip(5).ToArray();

性能特征与您的C示例非常不同,但是它们并不可怕。如果您希望获得性能,而不是像上面那样使用不安全,请使用相同的数组并从列表中所需的点开始迭代,或者使用array.Copy,如其他地方所示。

请注意:对于C代码,只有一个数组。您的另一个阵列实际上只是原始阵列的一个视图。如果确实需要两个数组,可以使用
Array.Copy()
,如下所示:

char[] s = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
char[] b = new char[5];
Array.Copy(s, 6, b, 0, 5);

还值得一提的是,在c#中,字符和字节是非常不同的东西。别把他们弄糊涂了,否则你会发现自己有麻烦的。此外,数组很少是C#中的最佳选项。使用一个类、一个泛型列表,甚至只是一个IEnumerable来代替。

注意:在C代码中,只有一个数组。您的另一个阵列实际上只是原始阵列的一个视图。如果确实需要两个数组,可以使用
Array.Copy()
,如下所示:

char[] s = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
char[] b = new char[5];
Array.Copy(s, 6, b, 0, 5);
还值得一提的是,在c#中,字符和字节是非常不同的东西。别把他们弄糊涂了,否则你会发现自己有麻烦的。此外,数组很少是C#中的最佳选项。使用类、泛型列表,甚至只是IEumerable。

该结构提供数组视图,而无需创建副本。但是,它不能用于需要字节数组的地方

ArraySegment<byte> myArraySegment = new ArraySegment<byte>(myArray, 2, 5);
该结构提供了阵列的视图,而无需创建副本。但是,它不能用于需要字节数组的地方

ArraySegment<byte> myArraySegment = new ArraySegment<byte>(myArray, 2, 5);