• c#中关于结构体和字节数组转化


    最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Runtime.InteropServices;
    namespace FileSendClient
    {
    
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        struct StructDemo
        {
           
            public byte a;
            public byte c;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
            public byte[] b;
            public byte d;
            public int e;
           
        }
        unsafe class Program
        {
            static void Main(string[] args)
            {
                StructDemo sd;
                sd.a = 0;
                sd.d = 0;
                sd.c = 0;
                sd.b = new byte[3] { 0, 0, 1 };
                sd.e = 5;
                int size = 0;
                //此处使用非安全代码来获取到StructDemo的值
                unsafe
                {
                    size = Marshal.SizeOf(sd);
                }
                
                byte[] b = StructToBytes(sd,size);
    
                ByteToStruct(b, typeof(StructDemo));
    
            }
    
    
            //将Byte转换为结构体类型
            public static byte[] StructToBytes(object structObj,int size)
            {
                StructDemo sd;
                int num = 2;
                byte[] bytes = new byte[size];
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将结构体拷到分配好的内存空间
                Marshal.StructureToPtr(structObj, structPtr, false);
                //从内存空间拷贝到byte 数组
                Marshal.Copy(structPtr, bytes, 0, size);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                return bytes;
    
            }
    
            //将Byte转换为结构体类型
            public static object ByteToStruct(byte[] bytes, Type type)
            {
                int size = Marshal.SizeOf(type);
                if (size > bytes.Length)
                {
                    return null;
                }
                //分配结构体内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将byte数组拷贝到分配好的内存空间
                Marshal.Copy(bytes, 0, structPtr, size);
                //将内存空间转换为目标结构体
                object obj = Marshal.PtrToStructure(structPtr, type);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                return obj;
            }
        }
    }
    

      

      

  • 相关阅读:
    Python学习之路2☞数据类型与变量
    Python学习之路1☞简介及入门代码
    OpenStack组件系列☞horizon搭建
    39
    38
    37
    36
    35
    33
    32
  • 原文地址:https://www.cnblogs.com/sdnyzhl/p/3045000.html
Copyright © 2020-2023  润新知