Подтвердить что ты не робот

Как преобразовать sbyte [] в байт [] в С#?

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

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

4b9b3361

Ответ 1

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

sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed; 

Ответ 2

Вам нужно будет скопировать данные (только массивы ссылочного типа являются ковариантными), но мы можем попытаться сделать это эффективно; 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

Ответ 3

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

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

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

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