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;
    
            }
    
        }
    
    }
  • 相关阅读:
    读《大道至简》第六章感想
    课后作业之数组
    读《大道至简》第五章感想
    课后作业四
    读《大道至简》第四章之感想
    java上课作业(第三次)
    读《大道至简》第三章感想
    作业
    小组项目冲刺第三天的个人总结
    小组项目冲刺第二天的个人总结
  • 原文地址:https://www.cnblogs.com/dj1232090/p/5720004.html
Copyright © 2011-2022 走看看