C#中如何定义联合型数据(long 和 byte[8] 联合)(如C++的union)? 我想得到一个long型的8个字节,让它和一个8字节数组联合就能得到C++中可以C#中没有union了结构不支持声明中创建实例,所以我没法用byte[] bytes=new byte[8];怎么办呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://community.csdn.net/Expert/topic/3360/3360584.xml?temp=.2905084 楼上的贴子里没有解决我问题的信息[StructLayout(LayoutKind.Explicit)]struct U{ [FieldOffset(0)] public byte[] c=new byte[2]; [FieldOffset(0)] public Int16 i; }这样不行,不能在结构中建实例还有什么解决方法么? 看来是没办法了c++肯定是能做不过C#用new 关键字分配内存我上面的那种方法即使成功也只不过是c的引用和i联合谢谢各位的帮助大家还有没有其它方法?..........................[StructLayout(LayoutKind.Explicit)]struct U{ [FieldOffset(0)] public byte[] c=new byte[2]; [FieldOffset(0)] public Int16 i; } 呵呵,终于被我这种菜鸟想出来了unsafe struct U{ public U(ulong val) { this.val = val; } public byte this[int index] { get { if (index >= 8 || index < 0) throw new IndexOutOfRangeException(); /* * 下面这句是不行的。 * fixed (byte* pv = (byte*)&val) * 因为固定语句赋值的右边不能是强制转换表达式 * 所以我们要用下面的这做法骗过编译器 */ fixed (ulong* pl = &val) { byte* pv = (byte*)pl; return pv[index]; } } set { if (index >= 8 || index < 0) throw new IndexOutOfRangeException(); fixed (ulong* pl = &val) { byte* pv = (byte*)pl; pv[index] = value; } } } public ulong val;}不过这样好象不太符合楼主的要求,这样只是定义了一个byte类型的索引器。当然索引器可以别的方法来实现存取byte。 这文章很不错可以仔细看看http://www.cnblogs.com/flier/archive/2004/08/14/33245.aspx 其实把我上面写的注释去掉代码看上去也不多了。反正目前vs.net2003里只能用索引器来实现你要的这种功能。具体索引器要怎么实现那就要看你的意思了。新的C#2.0(vs.net2005)好像可以很容易解决这个问题了,而且速度会好一点吧,而且可以弄成真正的union,我觉得。[StructLayout(LayoutKind.Explicit)]unsafe struct U{ [FieldOffset(0)] public ulong ulVal; [FieldOffset(0)] fixed public byte bVal[8];}上面的代码是我根据http://www.cnblogs.com/flier/archive/2004/08/14/33245.aspx推测的不知道能否通过编译。我也没C#2.0的编译器。 to loki51 [StructLayout(LayoutKind.Explicit)] unsafe struct U { [FieldOffset(0)] public ulong ulVal; [FieldOffset(0)] public fixed byte bVal[8]; }C#2.0编译通过,你的语法有点儿小问题,public 在fixed前面应该。不过个人觉得用unsafe code有点儿小题大作了,不过因为Array是Reference Type,不能够在栈上存在,如果不是很复杂的话,可以写一个如下的结构 [StructLayout(LayoutKind.Explicit)] struct U2 { [FieldOffset(0)] public ulong ulVal; [FieldOffset(0)] public U3 bVal; }U3的定义如下[StructLayout(LayoutKind.Sequential)] struct U3 { //[FieldOffset(0)] public byte a; // [FieldOffset(8)] public byte b; // [FieldOffset(16)] public byte c; // [FieldOffset(24)] public byte d; // [FieldOffset(32)] public byte e; // [FieldOffset(40)] public byte f; // [FieldOffset(48)] public byte g; // [FieldOffset(56)] public byte h;}代码在CSE 2005编译通过测试,虽然代码比较丑,但是对于简单的需求来说,个人觉得使用unsafe code并不是一个很好的方式,这也可以作为一种折中的解决方案。hehe linq是否可以直接实现类似abc分类的算法 c# repeater中判断 请问一个正则表达式的问题?如何将以下字符串替换为另外一个字符串 访问磁盘时出现设备未就绪应该怎么解决? C#应用程序如何做成窗户端程序 c# 高分提问 谁给我一个存储过程返回多个记录集的处理过程 WebServices和类库相比有什么好处,有什么坏处呀? c#如何使用sendmessage向后台程序发送按键 如何才能删除数据库表中的一列? (winform) 如何打印DataGrid中的内容啊? 如何搭建.net环境? ==图片合成问题==
[StructLayout(LayoutKind.Explicit)]
struct U
{
[FieldOffset(0)] public byte[] c=new byte[2];
[FieldOffset(0)] public Int16 i;
}这样不行,不能在结构中建实例
还有什么解决方法么?
c++肯定是能做
不过C#用new 关键字分配内存
我上面的那种方法即使成功
也只不过是c的引用和i联合谢谢各位的帮助
大家还有没有其它方法?..........................
[StructLayout(LayoutKind.Explicit)]
struct U
{
[FieldOffset(0)] public byte[] c=new byte[2];
[FieldOffset(0)] public Int16 i;
}
unsafe struct U
{
public U(ulong val)
{
this.val = val;
}
public byte this[int index]
{
get
{
if (index >= 8 || index < 0)
throw new IndexOutOfRangeException(); /*
* 下面这句是不行的。
* fixed (byte* pv = (byte*)&val)
* 因为固定语句赋值的右边不能是强制转换表达式
* 所以我们要用下面的这做法骗过编译器
*/
fixed (ulong* pl = &val)
{
byte* pv = (byte*)pl;
return pv[index];
}
}
set
{
if (index >= 8 || index < 0)
throw new IndexOutOfRangeException(); fixed (ulong* pl = &val)
{
byte* pv = (byte*)pl;
pv[index] = value;
}
}
}
public ulong val;
}
不过这样好象不太符合楼主的要求,这样只是定义了一个byte类型的索引器。当然索引器可以别的方法来实现存取byte。
http://www.cnblogs.com/flier/archive/2004/08/14/33245.aspx
[StructLayout(LayoutKind.Explicit)]
unsafe struct U
{
[FieldOffset(0)] public ulong ulVal;
[FieldOffset(0)] fixed public byte bVal[8];
}
上面的代码是我根据http://www.cnblogs.com/flier/archive/2004/08/14/33245.aspx推测的不知道能否通过编译。我也没C#2.0的编译器。
unsafe struct U
{
[FieldOffset(0)] public ulong ulVal;
[FieldOffset(0)] public fixed byte bVal[8];
}C#2.0编译通过,你的语法有点儿小问题,public 在fixed前面应该。不过个人觉得用unsafe code有点儿小题大作了,不过因为Array是Reference Type,不能够在栈上存在,如果不是很复杂的话,可以写一个如下的结构 [StructLayout(LayoutKind.Explicit)]
struct U2
{
[FieldOffset(0)]
public ulong ulVal;
[FieldOffset(0)]
public U3 bVal;
}U3的定义如下
[StructLayout(LayoutKind.Sequential)]
struct U3
{
//[FieldOffset(0)]
public byte a;
// [FieldOffset(8)]
public byte b;
// [FieldOffset(16)]
public byte c;
// [FieldOffset(24)]
public byte d;
// [FieldOffset(32)]
public byte e;
// [FieldOffset(40)]
public byte f;
// [FieldOffset(48)]
public byte g;
// [FieldOffset(56)]
public byte h;
}代码在CSE 2005编译通过测试,虽然代码比较丑,但是对于简单的需求来说,个人觉得使用unsafe code并不是一个很好的方式,这也可以作为一种折中的解决方案。hehe