我想得到一个long型的8个字节,让它和一个8字节数组联合就能得到
C++中可以
C#中没有union了
结构不支持声明中创建实例,所以我没法用byte[] bytes=new byte[8];
怎么办呢?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3360/3360584.xml?temp=.2905084
      

  2.   

    楼上的贴子里没有解决我问题的信息
    [StructLayout(LayoutKind.Explicit)]
    struct U
    {
     [FieldOffset(0)] public byte[] c=new byte[2];
     [FieldOffset(0)] public Int16 i; 
    }这样不行,不能在结构中建实例
    还有什么解决方法么?
      

  3.   

    看来是没办法了
    c++肯定是能做
    不过C#用new 关键字分配内存
    我上面的那种方法即使成功
    也只不过是c的引用和i联合谢谢各位的帮助
    大家还有没有其它方法?..........................
    [StructLayout(LayoutKind.Explicit)]
    struct U
    {
     [FieldOffset(0)] public byte[] c=new byte[2];
     [FieldOffset(0)] public Int16 i; 
    }
      

  4.   

    呵呵,终于被我这种菜鸟想出来了
    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。
      

  5.   

    这文章很不错可以仔细看看
    http://www.cnblogs.com/flier/archive/2004/08/14/33245.aspx
      

  6.   

    其实把我上面写的注释去掉代码看上去也不多了。反正目前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的编译器。
      

  7.   

    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