C#에서는 C/C 구조에서 바이트 배열 데이터를 수신할 때 배열을 호환 가능한 C# 구조로 변환해야 합니다. 다음 방법은 효율적인 변환 경로를 제공합니다.
이 방법에는 바이트 배열을 수정하고 Marshal.PtrToStructure를 사용하여 바이트를 C# 구조로 직접 변환하는 작업이 포함됩니다.
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); return stuff; } finally { handle.Free(); } }</code>
이 일반 버전을 사용하면 바이트 배열에서 모든 구조체 유형을 변환할 수 있습니다.
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } 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>
BinaryReader는 Marshal.PtrToStructure와 유사하게 작동하여 바이트 배열에서 데이터를 읽을 수 있습니다. 그러나 약간의 추가 오버헤드가 발생하므로 일반적으로 성능이 중요한 애플리케이션에는 권장되지 않습니다. Marshal.PtrToStructure는 중간 변환 없이 원시 바이트에서 직접 작동하므로 성능이 더 빠릅니다.
위 내용은 C/C 데이터 구조를 바이트 배열에서 C# 구조로 효율적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!