public struct abc           //
        {
           // public byte zhenlb_0;
           // public byte zhenchd_1;
            public byte xinxiid_2;
            public int ads;
        }
        private void test_Click_1(object sender, EventArgs e)
        {
            abc ab=new abc();
        //ab.zhenlb_0=0x11;
        //ab.zhenchd_1=0x22;
        ab.xinxiid_2=0x33;
        ab.ads = 0x11223344;        byte[] a = fun.StructureToByteArrayEndian(ab);
              }代码大概是如上, 我的测试代码。
结构体里面 有一个int 和byte,但是        public byte[] StructureToByteArrayEndian(object obj)
          {
              object thisBoxed = obj;   //copy ,将 struct 装箱
              Type test = thisBoxed.GetType();
  
              int offset = 0;
              int size = Marshal.SizeOf(obj);size中获取 结构体的大小是8.   应该是5啊, 这样创建的数组就比实际结构体中的数要多,数组中多出来很多0.  求助,
菜鸟.给跪了..

解决方案 »

  1.   

        public struct abc  
        {
            public byte xinxiid_2;
            public int ads;        public Int32 Size
            {
                get { return 5; }  
            }
        }abc的长度又不会变化
    直接写死就行了
      

  2.   

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct abc  
        {
            public byte xinxiid_2;
            public int ads;
        }这是另外的
      

  3.   

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct abc  
        {
            public byte xinxiid_2;
            public int ads;
            public String ss;        public Int32 Size
            {
                get { return 5 + System.Text.Encoding.UTF8.GetByteCount(ss); }
            }
        }
      

  4.   

    [StructLayout(LayoutKind.Explicit, Size = 5)]
        public struct abc  
        {
    [FieldOffset(0)]
            public byte xinxiid_2;
    [FieldOffset(1)]
            public int ads;
        }
    这样应该可以了,不过注意端序的问题。
      

  5.   

    试了下,c#调用Sizeof(object)函数时,给每个元素分配的内存大小是以该结构体最大的值类型所占内存大小作为标准来分配,比如你的abc 结构体,最大的值类型是Int,内存大小是四个字节,所以计算时,byte也为他分配四个字节。这也是为了调用StructureToPtr等非托管函数时方便,像使用的,intptr,那么在结构体转数组和数组转结构体时,就能以四个字节来分割了。要1个字节+5个字节就没法处理了。
    解决办法
    1.如果是为了在数组和结构体间转换的话,调用StructureToPtr和PtrToStructure就好,想要得到byte,可以把制定为强制转换为byte
    2.自己利用方法来将定义的结构体转换成数组,这个可以把结构体改成类,添加个计算个变量的byte总和的私有方法或静态方法都可以。
      

  6.   

    试了下,如果不加上size=5限定给结构体分配的内存长度,结果和楼主最开始是一样的,限定的话,和直接返回个5没区别了,仍然可以采用结构体的顺序布局
      

  7.   

    用SizeOf来计算struct的长度
    纯属脱裤子放屁
    多此一举
    如果struct里只有基本类型
    在定义struct时就已经知道长度了
    不需要在外面再SizeOf计算一次如果struct里含有引用类型,在外面用几次SizeOf都是不正确的,如:
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct abc  
        {
            public byte xinxiid_2;
            public int ads;
            public String ss;
            public DataSet ds;
            public DataTable dt;
        }
      

  8.   

    觉得直接返回大小是一样的,试试下面的代码:using System;
    using System.Runtime.InteropServices;
    class Program
    {
    [StructLayout(LayoutKind.Explicit, Size = 5)]
        public struct abc  
        {
    [FieldOffset(0)]
            public byte xinxiid_2;
    [FieldOffset(1)]
            public int ads;
        }
    [StructLayout(LayoutKind.Sequential, Size = 5)]
        public struct _bytes  
        {
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
    public byte[] data;
        }
    static void Main(string[] args)
    {
    abc x = new abc();
    x.xinxiid_2 = 17;
    x.ads = 0x00ffccaa;
    Console.WriteLine(Marshal.SizeOf(x));
    IntPtr p = System.Runtime.InteropServices.Marshal.AllocHGlobal(5);
    System.Runtime.InteropServices.Marshal.StructureToPtr(x, p, false);
    _bytes d = (_bytes)System.Runtime.InteropServices.Marshal.PtrToStructure(p, typeof(_bytes));
    Array.ForEach(d.data, b => Console.WriteLine(b.ToString("X")));
    Console.ReadLine();
    }
    }然后把abc的特性StructLayout构造参数改为LayoutKind.Sequential、去掉Size = 5,把_bytes中data长度改为8看看有什么不同。