簡體   English   中英

為什么char的存儲大小似乎會改變?

[英]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字符時,這是正確的,但在編組上下文中卻不是。

  • char是2個字節或16位Unicode字符(U +0000至U + ffff)
  • char []是指針類型
  • int是4個字節

因此,關於編組,我會選擇vcsjones的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM