С# Неявное/явное преобразование массива байтов

У меня следующая проблема. Я хочу преобразовать целочисленное значение или значение с плавающей запятой в массив байтов. Обычно я использую метод BitConverter.GetBytes().

int i = 10;
float a = 34.5F;
byte[] arr;

arr = BitConverter.GetBytes(i);
arr = BitConverter.GetBytes(a);

Есть ли возможность сделать это с помощью неявных/явных методов??

arr = i;
arr = a;

и наоборот??

i = arr;
a = arr;

person Nussti    schedule 23.01.2015    source источник


Ответы (2)


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

Проблема заключается в том, что при неявном приведении необходимо либо привести к, либо из типа, в котором вы объявили приведение, и вы не можете наследовать от запечатанных классов, таких как 'int'.

Так что это совсем не элегантно. Методы расширения, вероятно, более элегантны.

Если вы объявите класс ниже, вы можете делать такие вещи, как:

        byte[] y = (Qwerty)3;
        int x = (Qwerty) y;

public class Qwerty
{
    private int _x;

    public static implicit operator byte[](Qwerty rhs)
    {
        return BitConverter.GetBytes(rhs._x);
    }

    public static implicit operator int(Qwerty rhs)
    {
        return rhs._x;
    }

    public static implicit operator Qwerty(byte[] rhs)
    {
        return new Qwerty {_x = BitConverter.ToInt32(rhs, 0)};
    }

    public static implicit operator Qwerty(int rhs)
    {
        return new Qwerty {_x = rhs};
    }
}
person Dan Byström    schedule 23.01.2015

вы можете создать методы расширения, чтобы немного очистить вызывающий код, так что вы получите:

 int i = 10;
 float a = 34.5F;
 byte[] arr;

 arr = i.ToByteArray();
 arr = a.ToByteArray();

Код для методов расширения будет выглядеть примерно так:

public static class ExtensionMethods
    {
        public static byte[] ToByteArray(this int i)
        {
            return BitConverter.GetBytes(i);
        }

        public static byte[] ToByteArray(this float a)
        {
            return BitConverter.GetBytes(a);
        }
    }
person NDJ    schedule 23.01.2015