바이트 배열에서 C#으로 C/C 데이터 구조 읽기
이 문서에서는 C/C 구조에서 파생된 바이트 배열 데이터를 C# 구조에 채우는 방법을 설명합니다.
GCHandle 및 Marshal 사용
이 방법은 세 단계로 구분됩니다.
GCHandle.Alloc
을 사용하여 메모리에서 바이트 배열의 위치를 고정합니다. Marshal.PtrToStructure
인스턴스로 변환하려면 NewStuff
을 사용하세요. handle.Free()
을 사용하여 GCHandle
을 해제하세요. 단순 코드:
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); NewStuff stuff; try { stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); } finally { handle.Free(); } return stuff; }</code>
일반 버전:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { T stuff; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } return stuff; }</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>
BinaryReader 방법
BinaryReader
을 사용하는 것이 Marshal
방법보다 성능이 더 좋지 않을 수도 있습니다. 두 방법 모두 NewStuff
구조로 성공적으로 변환하려면 데이터의 레이아웃과 크기가 올바르게 설정되어야 합니다.
위 내용은 C/C 데이터 구조를 바이트 배열에서 C# 구조체로 효율적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!