C # flags размер слова перечисления - PullRequest
9 голосов
/ 22 августа 2009

Если я объявлю

[Flags]
public enum MyColor
{
    Red = 1;
    Green = 2;
    Blue = 4;
    White = 8;
    Magenta = 16;
    ... (etc)
}

Есть ли способ определить / установить количество байтов, которое занимает это перечисление? Кроме того, в каком порядке байтов это закончится? (например, должен ли я выполнить HostToNetwork () для правильной отправки его по проводам?) Кроме того, чтобы вызвать HostToNetwork, я могу привести в качестве байтового массива и выполнить итерацию?

Ответы [ 2 ]

10 голосов
/ 22 августа 2009
[Flags]
public enum MyColor : byte // sets the underlying type.
{
    Red = 0;
    Green = 1;
    Blue = 2;
    White = 4;
    Magenta = 8;
    ... (etc)
}

Невозможно напрямую установить порядок байтов. Вы можете использовать некоторые хорошо продуманные числа, которые моделируют байты с прямым порядком байтов в системе с прямым порядком байтов. Однако я бы всегда использовал явные API для преобразования байтовых порядков.

6 голосов
/ 26 августа 2009

Полный ответ:

  • Есть ли способ определить / установить количество байтов, которое занимает это перечисление?

Да

[Flags]
public enum MyColor : byte // sets the underlying type.
{
    Red = 1;
    Green = 2;
    Blue = 4;
    White = 8;
    Magenta = 16;
    ... (etc)
}
  • Кроме того, в каком порядке байтов это будет в итоге?

Что бы это ни было скомпилировано, поэтому для моего случая x86 (мало).

  • Кроме того, чтобы вызвать HostToNetwork, я могу привести в качестве байтового массива и выполнить итерацию?

Вот где это сложно. Я узнал несколько вещей:

  • базовый тип перечисления будет расширяться (или расширяться ": long", который вы должны пометить в конце объявления), и это должен быть тип. Так что на самом деле невозможно сделать то, что я действительно пытался сделать (перечисление 6 байтов).
  • сериализация этой структуры в массив байтов (для преобразования в сетевой порядок и отправки по сети) невероятно непроста. Класс BitConverter делает свое дело, но это очень полезно для танцев между промежуточными значениями: http://snipplr.com/view/15179/adapt-systembitconverter-to-handle-big-endian-network-byte-ordering-in-order-to-create-number-types-from-bytes-and-viceversa/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...