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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-19 07:36:10601검색

How to Efficiently Convert a C/C   Data Structure from a Byte Array to a C# Struct?

바이트 배열에서 C#으로 C/C 데이터 구조 읽기

이 문서에서는 C/C 구조에서 파생된 바이트 배열 데이터를 C# 구조에 채우는 방법을 설명합니다.

GCHandle 및 Marshal 사용

이 방법은 세 단계로 구분됩니다.

  1. GCHandle.Alloc을 사용하여 메모리에서 바이트 배열의 위치를 ​​고정합니다.
  2. 고정 메모리 주소를 Marshal.PtrToStructure 인스턴스로 변환하려면 NewStuff을 사용하세요.
  3. 변환이 완료되면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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