重载ToString()或是类型改换运行符struct为utf8编码.是什么意思

解决方案 »

  1.   

    每个struct内容是不一样的,不存在通用的struct到string的方法~
      

  2.   

    public struct Person
    {
    public string FirstName
    {
    get { return firstName; }
    set { firstName = value;}
    } public string SecondName
    {
    get { return secondName;}
    set { secondName = value;}
    } public override string ToString()
    {
    return string.Format("{0} {1}", firstName, secondName);
    } public static explicit operator string(Person aPerson)
    {
    return string.Format("{0} {1}", aPerson.firstName, aPerson.secondName);
    }
    private string firstName; private string secondName;
    }
      

  3.   

    用ToString函数或是强制类型转换都可以
      

  4.   

    楼主你要说你的最终目的是什么?
    比如DateTime或Color,
    转换后的string是什么?
      

  5.   

    是根据以前的C++代码改写.C++里面用到了memcpy()函数,把结构拷贝到char 数组,我现在要用C#实现这个功能
      

  6.   

    参考我写的一个dbf操作类的部门代码,你研究一下 unsafe, fix, encoding, marshal等,应该可以得到你想要的。     /// <summary>
        /// dbf文件的单个字段结构
        /// </summary>
        public unsafe struct DbfField
        {
            const int MaxFieldLength = 11;        #region 字段
            private fixed byte _FieldName[MaxFieldLength];
            /// <summary>
            /// 字段的类型
            /// </summary>
            public DbfFieldType FieldType;
            /// <summary>
            /// 保留
            /// </summary>
            private fixed byte Resvr1[4];
            /// <summary>
            /// 字段的长度
            /// </summary>
            public byte FieldSize;
            /// <summary>
            /// 字段的精度
            /// </summary>
            public byte Precision;
            /// <summary>
            /// 保留
            /// </summary>
            private fixed byte Resvr2[14];
            #endregion        #region 内存        /// <summary>
            /// 该结构类型的内存容量
            /// </summary>
            /// <returns></returns>
            public static int MemorySize()
            {
                unsafe
                {
                    return sizeof(DbfField);
                }
            }
            /// <summary>
            /// 从字节数组中装载数据
            /// </summary>
            /// <param name="src"></param>
            public void LoadMemory(byte[] src)
            {
                unsafe
                {
                    DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(src, 0);
                    this = *p;
                }        }
            /// <summary>
            /// 系列化到字节数组中
            /// </summary>
            /// <returns></returns>
            public byte[] GetMemory()
            {
                unsafe
                {
                    byte[] dest = new byte[MemorySize()];
                    DbfField* p = (DbfField*)Marshal.UnsafeAddrOfPinnedArrayElement(dest, 0);
                    *p = this;
                    return dest;
                }
            }
            /// <summary>
            /// 产生一个新的空的该类型的字节数组
            /// </summary>
            /// <returns></returns>
            public static byte[] NewMemory()
            {
                return new byte[MemorySize()];
            }
            #endregion        /// <summary>
            /// 用指定的字节数组构造
            /// </summary>
            /// <param name="src"></param>
            public DbfField(byte[] src)
            {
                this = new DbfField();
                LoadMemory(src);
            }        /// <summary>
            /// 字段名称
            /// </summary>
            public string FieldName
            {
                get
                {
                    fixed (DbfField* p = &this)
                    {
                        return Marshal.PtrToStringAnsi((IntPtr)p->_FieldName);
                    }
                }            set
                {
                    fixed (DbfField* p = &this)
                    {
                        for (int i = 0; i < MaxFieldLength; i++)
                            p->_FieldName[i] = 0;
                        byte* v = (byte*)Marshal.StringToHGlobalAnsi(value);
                        for (int i = 0; (i < MaxFieldLength) && (v[i] != 0); i++)
                            p->_FieldName[i] = v[i];
                    }
                }
            }        public void InitDefine(string fieldName, DbfFieldType fieldType, byte fieldSize, byte precision)
            {
                FieldName = fieldName;
                FieldType = fieldType;
                FieldSize = fieldSize;
                Precision = precision;
            }
        }
    最后,参考以下代码,将struct复制到string里
    Marshal.PtrToStringAnsi(Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, BufferIndex), len);
      

  7.   

    不过话又说回来,.Net托管代码反对直接操作内存,所以写一些硬件相关的程序的时候,内存块的操作在.Net里显得非常麻烦,比起C,C++,Delphi来讲难用的多的多的多多多多。
      

  8.   

    能不能变通一下,通过序列化和反序列化实现。
    http://www.microsoft.com/china/MSDN/library/archives/library/dndotnet/html/objserializ.asp