네트워크를 통해 데이터를 전송하거나 바이너리 파일로 저장할 때 구조를 바이트 배열로 변환해야 하는 경우가 많습니다. 구조는 여러 관련 데이터 요소를 포함하는 값 유형인 반면, 바이트 배열은 이진 데이터의 연속 블록입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!