C# 바이트 배열 내에서 C/C 데이터 구조를 효율적으로 처리
C#과 C/C 간의 상호 운용성을 위해서는 데이터 구조 변환이 필요한 경우가 많습니다. 이 문서에서는 데이터를 바이트 배열로 수신하고 이를 사용 가능한 C# 구조체로 변환하는 일반적인 시나리오를 다룹니다.
바이트 배열 데이터 구조의 구문 분석 전략
C#의 바이트 배열에서 C/C 구조를 성공적으로 구문 분석하는 열쇠는 다음 단계에 있습니다.
C# 구조체 정의 일치: C/C 구조의 레이아웃을 미러링하는 C# 구조체를 만듭니다. [StructLayout]
및 [FieldOffset]
과 같은 속성을 사용하여 데이터 유형, 크기 및 필드 오프셋을 정확하게 정의합니다.
메모리 고정: GCHandle
을 사용하여 바이트 배열을 고정하여 구문 분석 프로세스 중에 가비지 수집으로 인해 재배치되는 것을 방지합니다.
직접 메모리 캐스팅: Marshal.PtrToStructure
을 사용하여 고정된 메모리 주소를 정의된 C# 구조체로 직접 캐스팅합니다. 이는 다른 방법에 비해 뛰어난 성능을 제공합니다.
메모리 해제: 결정적으로, 데이터가 처리된 후 메모리 누수를 방지하려면 handle.Free()
을 사용하여 고정된 메모리를 해제하세요.
예시: C에서 C# 구조체로 변환
C 구조체(OldStuff
)와 이에 상응하는 C# 구조체(NewStuff
)를 고려해 보겠습니다.
C 구조체:
<code class="language-c++">typedef struct OldStuff { CHAR Name[8]; UInt32 User; CHAR Location[8]; UInt32 TimeStamp; UInt32 Sequence; CHAR Tracking[16]; CHAR Filler[12]; } OldStuff;</code>
C# 구조체:
<code class="language-csharp">[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)] public struct NewStuff { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] [FieldOffset(0)] public string Name; [MarshalAs(UnmanagedType.U4)] [FieldOffset(8)] public uint User; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] [FieldOffset(12)] public string Location; [MarshalAs(UnmanagedType.U4)] [FieldOffset(20)] public uint TimeStamp; [MarshalAs(UnmanagedType.U4)] [FieldOffset(24)] public uint Sequence; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] [FieldOffset(28)] public string Tracking; // Filler is omitted in C# as it's not needed for data access. }</code>
다음 C# 메서드는 바이트 배열 구문 분석을 보여줍니다.
<code class="language-csharp">public NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { return (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); } finally { handle.Free(); } }</code>
성능 최적화
BinaryReader
이 대안을 제공하는 반면, Marshal.PtrToStructure
은 일반적으로 형식 해석 오버헤드를 피하면서 메모리 주소를 직접 캐스팅하여 뛰어난 성능을 제공합니다. 이러한 직접적인 접근 방식은 대규모 데이터세트에 특히 유용합니다.
이러한 기술을 사용하면 개발자는 C# 바이트 배열에 포함된 C/C 데이터 구조를 효율적이고 효과적으로 구문 분석할 수 있습니다.
위 내용은 C#의 바이트 배열에서 C/C 데이터 구조를 효율적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!