>백엔드 개발 >C++ >마샬링을 사용하여 C# 구조를 바이트 배열로 변환하거나 그 반대로 변환하는 방법은 무엇입니까?

마샬링을 사용하여 C# 구조를 바이트 배열로 변환하거나 그 반대로 변환하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-24 14:36:14674검색

How to Convert C# Structures to and from Byte Arrays using Marshaling?

C#에서 구조를 바이트 배열로 변환

네트워크를 통해 데이터를 전송하거나 바이너리 파일로 저장할 때 구조를 바이트 배열로 변환해야 하는 경우가 많습니다. 구조는 여러 관련 데이터 요소를 포함하는 값 유형인 반면, 바이트 배열은 이진 데이터의 연속 블록입니다.

구조 정의

CIFS(Common Internet File System) 패킷을 나타내는 다음 C# 구조를 고려하십시오.

<code class="language-csharp">public struct CIFSPacket
{
    // ... various fields ...
    public string Buffer;
}</code>

변환 기능

구조를 바이트 배열로 변환하려면 Marshal 클래스의 StructToPtr 메서드를 사용할 수 있습니다. 이 메소드는 두 개의 매개변수를 허용합니다:

  • 구조: 변환할 구조입니다.
  • 포인터: 변환된 데이터가 저장될 바이트 배열의 시작 포인터입니다.

다음은 CIFSPacket 구조를 바이트 배열로 변환하는 함수입니다.

<code class="language-csharp">public static byte[] getBytes(CIFSPacket str)
{
    int size = Marshal.SizeOf(str);
    byte[] arr = new byte[size];

    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(str, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return arr;
}</code>

문자열 마샬링

문자열을 올바르게 마샬링하려면 MarshalAs 속성을 사용해야 합니다. 예를 들어, 버퍼 필드가 문자열인 경우 다음과 같이 주석을 달 수 있습니다.

<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>

이 속성은 문자열이 최대 100자 크기의 고정 길이, null 종료 문자열로 마샬링되어야 함을 나타냅니다.

구조 복원

구조의 바이트 배열 표현이 있으면 Marshal 클래스의 PtrToStructure 메서드를 사용하여 구조를 복원할 수 있습니다. 이 메소드는 두 개의 매개변수를 허용합니다:

  • 포인터: 구조 데이터를 포함하는 바이트 배열의 시작 포인터입니다.
  • 유형: 생성할 구조의 유형입니다.

다음은 바이트 배열을 다시 CIFSPacket 구조로 변환하는 함수입니다.

<code class="language-csharp">public static CIFSPacket fromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();

    int size = Marshal.SizeOf(str);
    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);

        Marshal.Copy(arr, 0, ptr, size);

        str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return str;
}</code>

사용방법

이러한 함수를 사용하려면 CIFSPacket 구조를 getBytes 함수에 전달하여 바이트 배열 표현을 얻으면 됩니다. 또는 fromBytes 함수에 바이트 배열을 전달하여 원래 구조를 다시 만들 수 있습니다.

마샬링 기술을 활용하면 구조를 바이트 배열로 쉽게 변환하거나 그 반대로 변환할 수 있어 효율적인 데이터 전송 및 저장이 가능합니다.

위 내용은 마샬링을 사용하여 C# 구조를 바이트 배열로 변환하거나 그 반대로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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