C# Struct的大小不对

C# Struct的大小不对,c#,struct,C#,Struct,我现在正试图得到C的结构大小。 但是,下面显示的结构的大小是16字节。58字节的输出是正常的,但我不知道出了什么问题 [Serializable, StructLayout(LayoutKind.Sequential,Pack =1)] public struct LOBBY_USER_INFO { LOBBY_DATA_HEADER ldh; int userPixNumber; //4byte byte[] userID; //50byte public

我现在正试图得到C的结构大小。 但是,下面显示的结构的大小是16字节。58字节的输出是正常的,但我不知道出了什么问题

[Serializable, StructLayout(LayoutKind.Sequential,Pack =1)]
public struct LOBBY_USER_INFO 
{
    LOBBY_DATA_HEADER ldh;
    int userPixNumber; //4byte
    byte[] userID; //50byte

    public LOBBY_USER_INFO(int data_size, int userPixNumber, string userID) 
    {

        this.ldh.data_size = data_size;
        this.userID = new byte[50];
        this.userID = Encoding.UTF8.GetBytes(userID);
        this.userPixNumber = userPixNumber;
    }
}

int size = Marshal.SizeOf(typeof(LOBBY_USER_INFO));
byte[]
是一个类而不是结构,因此
sizeof(byte[])
引用的大小(指针),它是
4
8
字节(
32
64
位)

byte[]
是一个类而不是结构,因此
sizeof(byte[])/code>是引用的大小(指针)是
4
8
字节(
32
64
位)

除了:

如果希望在结构中封送
userID
数组,请使用
marshallas(UnmanagedType.ByValArray,…)
属性:

[Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct LOBBY_USER_INFO
{
    //LOBBY_DATA_HEADER ldh;
    int userPixNumber; //4byte
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
    byte[] userID; //50byte
}

// .................
int size = Marshal.SizeOf(typeof(LOBBY_USER_INFO));
// size is 54 now
除此之外:

如果希望在结构中封送
userID
数组,请使用
marshallas(UnmanagedType.ByValArray,…)
属性:

[Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct LOBBY_USER_INFO
{
    //LOBBY_DATA_HEADER ldh;
    int userPixNumber; //4byte
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
    byte[] userID; //50byte
}

// .................
int size = Marshal.SizeOf(typeof(LOBBY_USER_INFO));
// size is 54 now

什么是
lobble\u DATA\u HEADER
已以.Thank you all.@J.Kim的形式解决,与问题无关,但需要注意的是:初始化
userID
的方式相当危险。
userID
不能保证长度为50字节。
this.userID=Encoding.UTF8.GetBytes(userID);
assignment将使用新数组替换前一行中创建的数组,该数组的长度取决于
userID
参数字符串长度。更安全的实现是:
var userBytes=Encoding.UTF8.GetBytes(userID);array.Copy(userBytes,this.userID,Math.Min(this.userID.length,userBytes.length))
请问什么是
lobb_DATA_HEADER
?字段userID是一个引用类型,它的大小与结构中的指针相同。请看一下'fixed'关键字和fixed buffersbyte[]userID;//50字节这不是真的。userID只是一个指针。Dmitry Bychenko的源代码[Marshallas(UnmanagedType.ByValArray,SizeConst=50)]已以.Thank you all.@J.Kim的形式解决,与问题无关,但需要注意的是:初始化
userID
的方式相当危险。
userID
不能保证长度为50字节。
this.userID=Encoding.UTF8.GetBytes(userID);
assignment将使用新数组替换前一行中创建的数组,该数组的长度取决于
userID
参数字符串长度。更安全的实现是:
var userBytes=Encoding.UTF8.GetBytes(userID);array.Copy(userBytes,this.userID,Math.Min(this.userID.length,userBytes.length))
非常感谢。谢谢你们,它是58字节输出的。谢谢你们的支持。非常感谢。谢谢你们,它是58字节输出的。谢谢你们的支持。非常感谢。非常感谢