문제

좋아, 그래서 나는 C#/C ++ 더 가르쳐주기 위해 작은 게임 엔진에서 계속 노력하고 있습니다. 이제 데이터를 이진 형식으로 저장하는 방법을 작성하려고합니다. (이것은 배우는 것입니다. 나는 이것을 처음부터 내 자신을하고 싶습니다). C ++로 읽을 때 구조 내부의 가변 길이 배열을 처리하는 가장 좋은 방법은 무엇입니까?

예를 들어 여기에 제가 현재 내 구조에 대해 가지고있는 것입니다.

 [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryHeader
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
        public Int32 m_NumberOfRecords;
        public FooBinaryRecordHeader[] m_BinaryRecordHeaders;
        public FooBinaryRecord[] m_BinaryRecords;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecordHeader
    {
        public Int32 m_FileNameLength;
        public char[] m_FileName;
        public Int64 m_Offset;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecord
    {
        public bool m_IsEncrypted;
        public Int64 m_DataSize;
        public byte[] m_Data;
    }

이제 C ++에서 실제로 C ++의 구조로 읽으려면 어떻게해야합니까? 나는 각 요소를 하나씩 읽고 구조로 복사하기를 바랐다.

내가 찾은 유일한 실제 자습서는 이것입니다. http://www.gamedev.net/community/forums/topic.asp?topic_id=310409& whichpage=1

나는 거친 추측을하고 이것을 C ++ 구조로 읽는 것이 실제로는 불가능하다고 말할 것입니다.

도움이 되었습니까?

해결책

바이너리 형식 에서이 구조의 사본을 매핑 할 수 있습니다. 각 배열은 포인터로 취급되어야 하며이 배열 크기의 정수가 있어야합니다.

예를 들어

씨#

    [StructLayout(LayoutKind.Sequential)]
    public struct A
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
    }

C ++

    struct A {
        int length
        char* vector
    }

참고 : 바이트의 크기가 같은 숯을 가지고 있습니다.

이진에서 읽을 때 처음 4 바이트 (int는 32 일, 4 바이트)를 읽고 4 + (읽기 길이)를 할당 한 후 할당 된 버퍼에 직접 읽고 구조로 취급 할 수 있습니다.


    		

다른 팁

구조에는 가변 길이 배열과 같은 것은 없습니다.

내가 구조가 있다고 가정 해 봅시다 point ~와 같은

struct point
{
    int x;
    int y;
}

이 중 5 개 배열을 원한다면 컴파일러는 기본적으로 10 개의 int를위한 공간을 예약합니다. 가변 길이 배열이 포함 된 구조 배열을 요청하면 어떻게됩니까? 각각에 얼마나 많은 공간을 예약 할 공간을 알 수 없기 때문에 메모리에있는 사람들을 정렬 할 수있는 방법은 없습니다.

당신이 ~할 수 있다 그렇게하는 것입니다 바늘 포인터는 일정한 크기이기 때문에 가변 길이 배열을 원하는 유형으로. 그런 다음 해당 유형의 많은 인스턴스에 대해 충분한 메모리를 할당하고 그렇게 지적합니다. 아마도 추가해야 할 것입니다 length 구조물로 필드로, 당신은 segfaulting을 위험에 빠뜨리기 전에 포인터를 지나가는 시간을 정확히 알 수 있습니다.

관리 및 관리되지 않는 코드와 메모리를 할당하고 자유롭게하는 사이에 약간의 털이 많은 털이 발생할 수 있지만 C ++ 및 C#을 함께 학습하기위한 또 다른 좋은 연습입니다.

Marshall.StructToptr을 사용하고 구조의 복사 길이를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top