zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
    

      

      

  • 相关阅读:
    catalina_home与catalina_base
    log4j配置
    lsof
    定时任务-crontab
    access日志配置
    java常识
    mysql事务隔离级别与实现原理
    文件描述符设置
    gpio 預設值
    synchronous interrupt and asynchronous interrupt
  • 原文地址:https://www.cnblogs.com/sdnyzhl/p/3045000.html
Copyright © 2011-2022 走看看