[英]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.