日期:2014-05-18 浏览次数:21095 次
[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); } } }
------解决方案--------------------
[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总和的私有方法或静态方法都可以。
------解决方案--------------------
public struct abc { public byte xinxiid_2; public int ads; public String ss; public DataSet ds; public DataTable dt; }
------解决方案--------------------
觉得直接返回大小是一样的,试试下面的代码:
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) {