У меня есть приложение 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 байта … Я знаю, что могу извлекать значения побайтно, но я хотел бы автоматизировать их, если это возможно. Спасибо за любые советы.
Как сказано в моем комментарии, вы не дали никакой информации о том, какой сериализатор используется. Тем не менее, формат напоминает мне о Абстрактная синтаксическая нотация номер один (ASN1), и приведенный пример потока действительно действителен, т.е. идентификаторы типов соответствуют идентификаторам, указанным в ASN1 (30 = SEQUENCE, 02 = INTEGER, …). Вы можете найти множество библиотек, способных десериализовать потоки ASN1, но у меня нет опыт работы с C #, поэтому я не могу дать вам никаких предложений на данный момент.
Других решений пока нет …