2010-04-12 2 views
0

Есть ли простой способ инициализировать массив байтов из части существующего массива байтов. В языке C можно использовать указатель, чтобы сказать, какИнициализировать массив байтов из части существующего массива байтов C#

char s[10] = new char[10]; 
char* b = s + 5; 

Можно ли сделать это в C#, как:

byte[] b = new byte[buffersize]; 
byte* header = b + 5; 
byte* data = b + 25; 
+3

Um ... ** байт = символ **! –

ответ

4

Структура ArraySegment<T> обеспечивает представление массива без создания копии. Однако он не может использоваться в тех местах, где ожидается массив байтов.

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

Если вам нужен массив байтов, вам необходимо скопировать нужные значения в новый экземпляр массива, предпочтительно с использованием Buffer.BlockCopy:

byte[] newArray = new byte[5]; 
Buffer.BlockCopy(myArray, 2, newArray, 0, 5); 
1

Это возможно, но это требует небезопасного кода:

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

Это, как говорится, обычно избегается, если это абсолютно необходимо в C#. Использование небезопасного кода не является нормой, поскольку оно, как было предложено, небезопасно. Этот тип кода может привести к многочисленным ошибкам, поэтому лучше всего переосмыслить дизайн.

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

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

Вам нужно будет использовать небезопасный код на 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; 
    } 
} 
1

Несомненно.

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

Характеристики исполнения отличаются от вашего примера, однако они действительно не страшны. Если вы ищете производительность, чем использование небезопасного, как описано выше, используйте тот же массив и просто начинайте выполнять итерацию с той точки в списке, который вы хотите, или используйте Array.Copy, как показано в другом месте.

0

Будьте осторожны: код 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.