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;
    
            }
    
        }
    
    }
  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/dj1232090/p/5720004.html
Copyright © 2011-2022 走看看