이진에 c# 변수 길이 구조를 작성하고 C ++에서 읽으십니까?
-
11-09-2019 - |
문제
좋아, 그래서 나는 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을 사용하고 구조의 복사 길이를 사용하십시오.