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;
            }

        }

  • 相关阅读:
    canvas gamebricks
    javascript 判断对象的值是否相等
    让控件全屏显示(WinForm)
    网络视频监控
    回调函数
    [导入][链接]FreeBSD + Sun Java
    [导入][一点一滴学英语]20060330
    [导入][来自网络] 酸酸甜甜就是我 不用我多介绍了 可是你是否听过天津话的版本?
    [导入][链接]差点漏掉 Eclipse 3.2 M6出来了
    [导入][链接]Five reasons why you should never use PostgreSQL
  • 原文地址:https://www.cnblogs.com/evlon/p/865272.html
Copyright © 2011-2022 走看看