读书人

哪位高手给 解决了, 小弟我就拜师学艺

发布时间: 2012-08-30 09:55:54 作者: rapoo

谁给 解决了, 我就拜师学艺, 提着两斤二锅头,跟他撸两串腰子.
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. 求助,
菜鸟.给跪了..

[解决办法]
我夜宵去
没有二锅头
没有腰子
只有干炒牛河



[解决办法]
搜索一下:字节对齐
[解决办法]

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

[StructLayout(LayoutKind.Explicit, Size = 5)]
public struct abc
{
[FieldOffset(0)]
public byte xinxiid_2;
[FieldOffset(1)]
public int ads……

[解决办法]
用SizeOf来计算struct的长度
纯属脱裤子放屁
多此一举
如果struct里只有基本类型
在定义struct时就已经知道长度了
不需要在外面再SizeOf计算一次

如果struct里含有引用类型,在外面用几次SizeOf都是不正确的,如:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
C# code
    public struct abc      {        public byte xinxiid_2;        public int ads;        public String ss;        public DataSet ds;        public DataTable dt;    }
[解决办法]
觉得直接返回大小是一样的,试试下面的代码:
C# code
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();    }} 

读书人网 >C#

热点推荐