Как конвертировать sbyte [] в byte [] в C #? - PullRequest
30 голосов
/ 06 мая 2009

У меня есть функция, которая заполняет массив типа sbyte [], и мне нужно передать этот массив другой функции, которая принимает параметр типа byte [].

Могу ли я преобразовать его красиво и быстро, не копируя все данные или не используя unsafe magic?

Ответы [ 3 ]

47 голосов
/ 24 марта 2011

Да, вы можете. Поскольку и byte, и sbyte имеют одинаковое двоичное представление, копировать данные не нужно. Просто выполните приведение к массиву, затем приведите его к byte[], и этого будет достаточно.

sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed; 
25 голосов
/ 06 мая 2009

Вам придется копировать данные (ковариантны только массивы ссылочного типа), но мы можем попытаться сделать это эффективно; Buffer.BlockCopy, кажется, работает:

    sbyte[] signed = { -2, -1, 0, 1, 2 };
    byte[] unsigned = new byte[signed.Length];
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length);

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

    Foo[] arr = { new Foo(), new Foo() };
    IFoo[] iarr = (IFoo[])arr;
    Console.WriteLine(ReferenceEquals(arr, iarr)); // true
6 голосов
/ 06 мая 2009

Если вы используете .NET 3.5+, вы можете использовать следующее:

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);

Что, я думаю, эффективно копирует все данные.

Обратите внимание, что эта функция также есть в .NET 2.0, но вам придется использовать анонимный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...