Сериализованная структура C ++ с 3-байтовыми блоками?

У меня есть приложение C ++, которое отправляет сериализованную структуру в мое приложение C #, и я хотел бы автоматически копировать байты непосредственно в новую структуру, которую я создал в C #. Однако структура, отправляемая по сети, кажется, имеет 3-байтовые блоки, что выглядит довольно странно.

Вот структура C ++:

typedef struct ATTQueryAgentStateConfEvent_t {
ATTWorkMode_t workMode;  /* enum type */
ATTTalkState_t talkState;  /* enum type */
long reasonCode;
ATTWorkMode_t pendingWorkMode;   /* enum type */
long pendingReasonCode;
} ATTQueryAgentStateConfEvent_t;

Структура, которую я создал в C #:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct ATTQueryAgentStateConfEvent_t
{
public ATTWorkMode_t workMode;  /* enum type */
public ATTTalkState_t talkState;  /* enum type */
public long reasonCode;
public ATTWorkMode_t pendingWorkMode;  /* enum type */
public long pendingReasonCode;
};

А вот байты, полученные из приложения C ++ (первые 6 байтов выглядят как заголовки):

02 00 68 00 30 0f 0a 01 03 0a 01 01 02 01 00 0a 01 ff 02 01 00
^^       ^^       ^^       ^^       ^^

Выше я отметил значения, которые я ожидаю получить (3, 1, 0, -1, 0). Я экспериментировал с различными значениями Pack при определении структуры C #, но он просто не анализируется правильно. Это команда, которую я использую для заполнения структуры в C #:

ATTQueryAgentStateConfEvent_t stateDetails = (ATTQueryAgentStateConfEvent_t)Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(confPrivData.data, 6), typeof(ATTQueryAgentStateConfEvent_t));

Я делаю что-то не так, или это приложение на C ++ использует какой-то пользовательский сериализатор? Я ожидаю, что перечисления и длинные значения C ++ будут 4 байта … Я знаю, что могу извлекать значения побайтно, но я хотел бы автоматизировать их, если это возможно. Спасибо за любые советы.

3

Решение

Как сказано в моем комментарии, вы не дали никакой информации о том, какой сериализатор используется. Тем не менее, формат напоминает мне о Абстрактная синтаксическая нотация номер один (ASN1), и приведенный пример потока действительно действителен, т.е. идентификаторы типов соответствуют идентификаторам, указанным в ASN1 (30 = SEQUENCE, 02 = INTEGER, …). Вы можете найти множество библиотек, способных десериализовать потоки ASN1, но у меня нет опыт работы с C #, поэтому я не могу дать вам никаких предложений на данный момент.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]