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

У меня следующая проблема. Я хочу преобразовать целочисленное значение или значение с плавающей запятой в массив байтов. Обычно я использую метод 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)


arrow_upward
4
arrow_downward

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

Проблема заключается в том, что при неявном приведении необходимо либо привести к, либо из типа, в котором вы объявили приведение, и вы не можете наследовать от запечатанных классов, таких как '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

arrow_upward
3
arrow_downward

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

 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