[英]Why does the storage size of a char seem to change?
如果我做
char c = 'A';
byte[] b = BitConverter.GetBytes(c);
b的长度是2。
但是,如果我有以下用于互操作的结构
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
int i;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
char[] c;
public int TheInt
{
get { return i; }
set { i = value; }
}
public string TheString
{
get { return new string(c); }
set { c = value.ToCharArray(); }
}
}
然后做
MyStruct m = new MyStruct();
m.TheInt = 10;
m.TheString = "Balloons";
int mSize = Marshal.SizeOf(m);
mSize是12,而不是我预期的20。
MSDN说char存储为2个字节。 第一个示例支持这一点。
我的结构做错了吗? 我想念什么吗?
因为您正在编组,并且默认情况下,一个char
将被编组为ANSI char而不是Unicode char。 因此,“ balloon”是8个字符,ANSI编码时为8个字节,int则为4个字节,即12个字节。
如果您希望编组的大小为20,请更改StructLayout
并将ChatSet设置为Unicode:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
现在您的结构大小为20。
MSDN说char存储为2个字节。
当我们谈论CLR字符时,这是正确的,但在编组上下文中却不是。
因此,关于编组,我会选择vcsjones的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.