C#의 바이트 배열에서 C/C 구조 구문 분석
C 또는 C#에서 C의 데이터 구조를 다룰 때는 해당 내용을 효율적으로 구문 분석하고 해석하는 것이 중요합니다. 일반적인 작업은 바이트 배열로 저장된 C/C 구조를 해당 C# 구조로 변환하는 것입니다.
데이터 복제 모범 사례
가장 직접적인 방법은 GCHandle
을 사용하여 메모리 내 바이트 배열의 위치를 고정하고 Marshal.PtrToStructure
을 사용하여 고정 포인터를 구조체로 변환한 후 마지막으로 고정 핸들을 해제하는 것입니다. 이 방법은 상대적으로 효율적이며 데이터가 바이트 배열에서 C# 구조로 복사되도록 합니다.
<code class="language-csharp">GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned); NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); handle.Free();</code>
일반 및 안전하지 않은 옵션
이 방법을 다양한 크기의 구조에 적용하려면 다음과 같은 일반 함수를 작성하면 됩니다.
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); return stuff; } finally { handle.Free(); } }</code>
또는 더 깔끔한 구문을 위해 안전하지 않은 버전을 사용할 수 있습니다.
<code class="language-csharp">unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct { fixed (byte* ptr = &bytes[0]) { return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T)); } }</code>
이러한 방법은 C#의 바이트 배열에서 C/C 구조를 구문 분석하는 편리하고 효율적인 방법을 제공합니다.
BinaryReader 성능 노트
BinaryReader
클래스를 사용하여 이 작업을 수행할 수는 있지만 Marshal.PtrToStructure
방법에 비해 성능이 크게 향상되지는 않습니다. 두 가지 방법 모두 메모리에 바이트 배열을 고정하고 기본 데이터에 직접 액세스하는 작업이 포함되므로 비슷한 오버헤드가 발생합니다.
위 내용은 C#의 바이트 배열에서 C/C 구조를 효율적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!