C# Struct的大小不对
我现在正试图得到C的结构大小。 但是,下面显示的结构的大小是16字节。58字节的输出是正常的,但我不知道出了什么问题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
[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字节输出的。谢谢你们的支持。非常感谢。非常感谢