[StructLayout(LayoutKind.Sequential)]  
    public struct NameStruct
    {
        public uint unk1;//0位置
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]  
        public uint[] unk2;
        public ulong unk3;//0x18
        public byte b;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x37)]  
        public byte[] name;//0x21
    }在这个结构体中,name是一个字符串,在结构体开始位+0x21的位置,以UTF8编码,总长不超过0x37bytes
Encoding.UTF8.GetString(nameStruct.name)现在我通过这样访问结构体的中name,觉得很麻烦,
怎么样定义后通nameStruct.name就能得到字符串

解决方案 »

  1.   

    为避免不必要的麻烦,可以在结构体里添加一个属性定义
    public string Name
    {
    get { return Encoding.UTF8.GetString(this.name); }
    }也可以将name字段改为string定义,并修改MarshalAs特性的参数为UnmanagedType.ByValTStr
      

  2.   

    0x21 指位 还是字节?
    如果是字节的话
    可以用fieldoffset 属性定义
      

  3.   


        public struct NameCache
        {
            public uint unk1;//0位置
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]  
            public uint[] unk2;
            public ulong unk3;//0x18
            public byte b;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x37)]  
            public byte[] name;//0x21
            public string Name
            {
                get { return Encoding.UTF8.GetString(this.name).Trim('\0'); }
            }
        }