为什么字符的存储大小似乎会发生变化

本文关键字:变化 字符 存储 为什么 | 更新日期: 2023-09-27 18:35:33

如果我这样做

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 说字符存储是 2 个字节。第一个示例支持这一点。

我的结构做错了吗?我错过了什么吗?

为什么字符的存储大小似乎会发生变化

因为您正在封送处理,默认情况下,char将被编送到 ANSI 字符而不是 Unicode 字符。所以"气球"是 8 个字符,在 ANSI 编码时是 8 个字节,加上 int 的 4 个字节,即 12。

如果您希望封送大小为 20,请更改StructLayout并将 ChatSet 设置为 Unicode:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]

现在,您的结构大小将变为 20。

MSDN 说字符存储是 2 个字节。

当我们谈论 CLR 字符时,情况确实如此,但在编组上下文中则不然。

  • char 是 2 个字节或 16 位 Unicode 字符(U +0000 到 U +ffff)
  • 字符 [] 是指针类型
  • int 是 4 个字节

因此,关于编组,我会选择vcsjones的答案。