2012-10-26 2 views
3

나는 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 바이트가 될 것으로 기대한다. 바이트 단위로 값을 추출 할 수 있다는 것을 알고 있지만 가능하다면 자동화하고 싶다. 모든 팁 주셔서 감사.

+1

이 질문에 사용하는 serializer에 대한 정보가 없으면 거의 대답 할 수 없습니다. C++의 표준 시리얼 라이저 또는 이와 유사한 언어로 통합 된 것은 없습니다. 귀하의 바이트 스트림을 볼 때 나는이 값들 각각이 아마도 데이터의 길이 인 선행 01을 가지고 있음을 주목합니다. 세 번째 바이트는 아마도 인코딩 된 유형 정보 (enum = 0a, long = 02)입니다. 한 바이트 내에 맞지 않는 값을 할당하려고 시도하고 바이트 스트림에서 무엇이 변경되는지 확인하거나이 serializer에서 사용할 수있는 소스 코드가 있는지 확인하는 것이 좋습니다. – Stacker

+0

또한 헤더의 여섯 번째 바이트 0fh = 15는 다음 일련 화 된 값의 스트림의 길이이고 앞의 30은 아마도 struct (-ured) 유형의 코드입니다. – Stacker

답변

3

내 의견에 말했듯이 어떤 serializer가 사용되고 있는지에 대한 정보를 제공하지 않았습니다. 그러나 형식은 Abstract Syntax Notation One (ASN1)을 생각 나게하고 주어진 예제 스트림이 실제로 유효합니다. 즉 유형 ID가 ASN1 (30 = SEQUENCE, 02 = INTEGER, ...)에 지정된 것과 일치합니다. ASN1 스트림을 deserialize 할 수 있지만 C#에 대한 경험이 없으므로이 시점에서 어떤 제안도 드릴 수 없습니다.

+0

감사합니다. 정확히 같은 경우입니다. C# ASN.1 디시리얼라이저를 찾거나 올바른 형식의 메시지를 알게되었으므로 직접 작성합니다. – bluemax