这个是我自己写的一个类,用Marshal来实现快还是自己组织各个字段成字节数组快?
另外为什么单独Marshal.Sizeof(LedConflict)是2,但是实际在CrossError类中ledconflict[]却占用了96个字节。
[StructLayout(LayoutKind.Sequential)]
public class LedConflict
{
private byte ledone;
private byte ledtwo; public LedConflict()
{
ledone = 0xff;
ledtwo = 0xff;
} public byte LedOne
{
get { return ledone; }
set
{
if (value >= 0 && value < 24)
{
ledone = value;
}
}
} public byte LedTwo
{
get { return ledtwo; }
set
{
if (value >= 0 && value < TCStatic.MAXLED)
{
ledtwo = value;
}
}
} } [StructLayout(LayoutKind.Sequential)]
public class CrossError
{
private bool powerdown;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=24)]
private byte[] status;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
private LedConflict[] ledconflict; public CrossError()
{
powerdown = false;
status = new byte[TCStatic.MAXLED];
ledconflict = new LedConflict[TCStatic.MAXLED];
for (int i = 0; i < TCStatic.MAXLED; i++)
ledconflict[i] = new LedConflict();
} public int Size
{
get { return Marshal.SizeOf(this); }
} public bool Powerdown
{
get { return powerdown; }
set { powerdown = value; }
} public byte[] Status
{
get { return status; }
set { status = value; }
} public LedConflict[] LedConflict
{
get { return ledconflict; }
set { ledconflict = value; }
} public byte[] CopytoBytes()
{
byte[] bytes = new byte[this.Size];
IntPtr p = Marshal.AllocHGlobal(this.Size);
Marshal.StructureToPtr(this, p, false);
Marshal.Copy(p, bytes, 0, this.Size);
Marshal.FreeHGlobal(p);
return bytes;
} public void FromBytes(byte[] bytes)
{
IntPtr p = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, p, bytes.Length);
Marshal.PtrToStructure(p, this);
Marshal.FreeHGlobal(p);
}
}
另外为什么单独Marshal.Sizeof(LedConflict)是2,但是实际在CrossError类中ledconflict[]却占用了96个字节。
[StructLayout(LayoutKind.Sequential)]
public class LedConflict
{
private byte ledone;
private byte ledtwo; public LedConflict()
{
ledone = 0xff;
ledtwo = 0xff;
} public byte LedOne
{
get { return ledone; }
set
{
if (value >= 0 && value < 24)
{
ledone = value;
}
}
} public byte LedTwo
{
get { return ledtwo; }
set
{
if (value >= 0 && value < TCStatic.MAXLED)
{
ledtwo = value;
}
}
} } [StructLayout(LayoutKind.Sequential)]
public class CrossError
{
private bool powerdown;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=24)]
private byte[] status;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
private LedConflict[] ledconflict; public CrossError()
{
powerdown = false;
status = new byte[TCStatic.MAXLED];
ledconflict = new LedConflict[TCStatic.MAXLED];
for (int i = 0; i < TCStatic.MAXLED; i++)
ledconflict[i] = new LedConflict();
} public int Size
{
get { return Marshal.SizeOf(this); }
} public bool Powerdown
{
get { return powerdown; }
set { powerdown = value; }
} public byte[] Status
{
get { return status; }
set { status = value; }
} public LedConflict[] LedConflict
{
get { return ledconflict; }
set { ledconflict = value; }
} public byte[] CopytoBytes()
{
byte[] bytes = new byte[this.Size];
IntPtr p = Marshal.AllocHGlobal(this.Size);
Marshal.StructureToPtr(this, p, false);
Marshal.Copy(p, bytes, 0, this.Size);
Marshal.FreeHGlobal(p);
return bytes;
} public void FromBytes(byte[] bytes)
{
IntPtr p = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, p, bytes.Length);
Marshal.PtrToStructure(p, this);
Marshal.FreeHGlobal(p);
}
}
解决方案 »
- 怎样获得你在datagridview中选中的值的索引号
- 普通类控制winform窗体中控件值的问题.
- .net xmlMenus.xml 控制权限的问题
- visual studio自动生成的ListView想改属性怎么办
- DataGridView回车键的处理 DataGridView中,回车键的默认操作是提交更改,并且焦点转移到下一行的单元格..
- 请高手推荐几本c#的入门的书~!
- WinForm的DataGrid问题,我想了好半天,没有头绪!
- .net中如何从特定位置引用DLL
- mono运行winform窗体时报错
- 在DataGrid中嵌入ChecBox,你用过么?!!!!!!!!!!!!!!!
- c#类库里调用窗体的自定义属性
- AjaxControlToolkit Slider 上传进度条例子
这里如果用structure,应该可以量出实际的值。