zoukankan      html  css  js  c++  java
  • 从struct到byte[]之RawFormatter

        public partial class Form1 : Form
        
    {
            
    public Form1()
            
    {
                InitializeComponent();
            }


            
    private void Form1_Load(object sender, EventArgs e)
            
    {
                Demo d 
    = new Demo();
                d.a 
    = 5;
                d.b 
    = 10;
                d.c 
    = new byte[]{1,2,3};
                d.s 
    = "123";
                
    byte[] buf = RawFormatter.RawSerialize(d);

                

                MessageBox.Show(
    "aaa");
                
            }

        }


        [StructLayout(LayoutKind.Sequential,Pack
    =1,CharSet=CharSet.Ansi)]
        
    struct Demo
        
    {
            
    public byte a;
            
    public int b;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst 
    = 3)]
            
    public byte[] c;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
    = 5)]
            
    public string s;
        }


        
    public class RawFormatter
        
    {
            
    public static byte[] RawSerialize(object anything)
            
    {
                
    int rawsize = Marshal.SizeOf(anything);
                IntPtr buffer 
    = Marshal.AllocHGlobal(rawsize);
                Marshal.StructureToPtr(anything, buffer, 
    false);
                
    byte[] rawdatas = new byte[rawsize];
                Marshal.Copy(buffer, rawdatas, 
    0, rawsize);
                Marshal.FreeHGlobal(buffer);
                
    return rawdatas;
            }


            
    public static object RawDeserialize(byte[] rawdatas, Type anytype)
            
    {
                
    int rawsize = Marshal.SizeOf(anytype);
                
    if (rawsize > rawdatas.Length)
                    
    return null;
                IntPtr buffer 
    = Marshal.AllocHGlobal(rawsize);
                Marshal.Copy(rawdatas, 
    0, buffer, rawsize);
                
    object retobj = Marshal.PtrToStructure(buffer, anytype);
                Marshal.FreeHGlobal(buffer);
                
    return retobj;
            }

        }

  • 相关阅读:
    大数据下高并发的处理详解
    【玩转TensorFlow】TensorFlow常见问题详解
    在阿里云上两分钟玩转AlextNet
    【前端精华】React源码分析系列
    svm
    神经网络结构选择
    神经网络反向传播跳出局部极小
    ubuntu16.04设置电池充电阈值
    pandas datafram重命名列名称
    centos6.8/ubuntu 安装python2.7 or python3.6
  • 原文地址:https://www.cnblogs.com/evlon/p/865272.html
Copyright © 2011-2022 走看看