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

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

Patricia Arquette
Patricia Arquette원래의
2025-01-19 06:10:10855검색

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

C# 바이트 배열 내에서 C/C 데이터 구조를 효율적으로 처리

C#과 C/C 간의 상호 운용성을 위해서는 데이터 구조 변환이 필요한 경우가 많습니다. 이 문서에서는 데이터를 바이트 배열로 수신하고 이를 사용 가능한 C# 구조체로 변환하는 일반적인 시나리오를 다룹니다.

바이트 배열 데이터 구조의 구문 분석 전략

C#의 바이트 배열에서 C/C 구조를 성공적으로 구문 분석하는 열쇠는 다음 단계에 있습니다.

  1. C# 구조체 정의 일치: C/C 구조의 레이아웃을 미러링하는 C# 구조체를 만듭니다. [StructLayout][FieldOffset]과 같은 속성을 사용하여 데이터 유형, 크기 및 필드 오프셋을 정확하게 정의합니다.

  2. 메모리 고정: GCHandle을 사용하여 바이트 배열을 고정하여 구문 분석 프로세스 중에 가비지 수집으로 인해 재배치되는 것을 방지합니다.

  3. 직접 메모리 캐스팅: Marshal.PtrToStructure을 사용하여 고정된 메모리 주소를 정의된 C# 구조체로 직접 캐스팅합니다. 이는 다른 방법에 비해 뛰어난 성능을 제공합니다.

  4. 메모리 해제: 결정적으로, 데이터가 처리된 후 메모리 누수를 방지하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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