>백엔드 개발 >C++ >C#의 바이트 배열에서 C/C 구조를 효율적으로 구문 분석하는 방법은 무엇입니까?

C#의 바이트 배열에서 C/C 구조를 효율적으로 구문 분석하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-19 06:04:14471검색

How to Efficiently Parse C/C   Structures from Byte Arrays in C#?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.