C# против C: организация структур данных - PullRequest
2 голосов
/ 27 марта 2020

Я хочу определить структуру данных, к которой я могу получить байтовый доступ. Другими словами: я хочу передать объект определенной c структуры данных в байтовом выражении.

Цель состоит в том, чтобы иметь высокий уровень доступа (доступ по имени) к данным, а также низкий уровень доступ только по байту.

У меня есть протокол передачи данных, который имеет определенный c формат пакета (заголовок, полезная нагрузка, CR C, ... четные определения битов. В конечном итоге весь пакет выровнен по 32-битному).

В "C" я определяю структуру и обращаюсь к объекту этой структуры побайтно, преобразовывая этот объект в байтовый массив. Т.е.:

/* C-Code */
typedef struct
{
    int16_t a;
    int8_t b;

    /* And a bit-wise definition to make thinks really cool */
    int8_t bit_0   : 1;
    int8_t bit_1_7 : 7;

    /* (Total size is 4 bytes i.e. 32-bit aligned) */
} MY_STRUCT_t;

"my_struct" теперь должно читаться побайтно, например, для передачи его куда-нибудь, где: Невыразительный способ:

/* C-Code */
void main(void)
{
    MY_STRUCT_t my_struct;

    for(uint32_t i = 0; i < sizeof(my_struct); i++)
    {
        Transfer_Byte( *((uint8_t *) &my_struct) + i);
    }
}

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

/* C-Code */
typedef union
{
    MY_STRUCT_t data;
    uint8_t bytes[sizeof(MY_STRUCT_t)];
} MY_STRUCT_u;

и сделаю так:

/* C-Code */
void main(void)
{
    MY_STRUCT_u my_struct; // object of the union this time!

    for(uint32_t i = 0; i < sizeof(my_struct); i++)
    {
        Transfer_Byte(my_struct.bytes[i]);
    }
}

Вопрос

  • Как мне это сделать в C#? Каково ваше предложение? Или вы могли бы дать мне подсказку, как решить эту проблему?

Ура

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Для C# лучше всего реализовать функции «ToByte» и «FromByte» и обрабатывать поля напрямую, чтобы гарантировать, что данные упорядочены так, как вы sh.

КСТАТИ . Я осторожно использую трюк struct union, если только ваша упаковка и распаковка на той же платформе и в исполняемом файле, что и порядок байтов, не зависят от платформы и компилятора для многобайтовых значений.

1 голос
/ 27 марта 2020

Для доступа низкого уровня существует поле StructLayoutAttribute.Pack в сочетании с FieldOffsetAttribute

С этими атрибутами вы можете управлять выравниванием байтов в структура.

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