나는 C# 응용 프로그램에 직렬화 된 구조체를 보내는 C++ 응용 프로그램을 가지고 있으며 C#으로 만든 새 구조체에 바이트를 직접 자동 복사하려고합니다. 그러나 네트워크를 통해 전송 된 구조체는 3 바이트 블록을 가지고있는 것으로 보이는데 이는 매우 이상하게 보입니다.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#에서 생성 된 구조체 : 여기
는 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)을 받기를 기대하는 값입니다. 나는 C# 구조체를 정의 할 때 다른 Pack 값을 실험했지만 단순히 올바르게 구문 분석되지 않았습니다.
ATTQueryAgentStateConfEvent_t stateDetails = (ATTQueryAgentStateConfEvent_t)Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(confPrivData.data, 6), typeof(ATTQueryAgentStateConfEvent_t));
내가 뭔가 잘못하고 있는가, 또는이 C++ 응용 프로그램은 일부 사용자 지정 serializer를 사용하고 있습니다 : 이것은 내가 C#에서 구조체를 채우기 위해 사용하고있는 명령입니다? 나는 C++ enum과 longs가 4 바이트가 될 것으로 기대한다. 바이트 단위로 값을 추출 할 수 있다는 것을 알고 있지만 가능하다면 자동화하고 싶다. 모든 팁 주셔서 감사.
이 질문에 사용하는 serializer에 대한 정보가 없으면 거의 대답 할 수 없습니다. C++의 표준 시리얼 라이저 또는 이와 유사한 언어로 통합 된 것은 없습니다. 귀하의 바이트 스트림을 볼 때 나는이 값들 각각이 아마도 데이터의 길이 인 선행 01을 가지고 있음을 주목합니다. 세 번째 바이트는 아마도 인코딩 된 유형 정보 (enum = 0a, long = 02)입니다. 한 바이트 내에 맞지 않는 값을 할당하려고 시도하고 바이트 스트림에서 무엇이 변경되는지 확인하거나이 serializer에서 사용할 수있는 소스 코드가 있는지 확인하는 것이 좋습니다. – Stacker
또한 헤더의 여섯 번째 바이트 0fh = 15는 다음 일련 화 된 값의 스트림의 길이이고 앞의 30은 아마도 struct (-ured) 유형의 코드입니다. – Stacker