【问题标题】:Why does the storage size of a char seem to change?为什么 char 的存储大小似乎发生了变化?
【发布时间】:2014-12-29 19:30:44
【问题描述】:

如果我这样做

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 个字节。 第一个例子支持这一点。

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

【问题讨论】:

    标签: c# struct char interop marshalling


    【解决方案1】:

    因为您正在编组,默认情况下,char 将编组为 ANSI 字符而不是 Unicode 字符。所以“气球”是 8 个字符,ANSI 编码时是 8 个字节,加上你的 int 的 4 个字节,即 12。

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

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

    现在你的结构体大小为 20。

    MSDN 说 char 存储是 2 个字节。

    当我们谈论 CLR char 时确实如此,但不是在编组的上下文中。

    【讨论】:

    • 这样排序了!现在已经纠缠了几个小时,没有考虑 CharSet 属性。仅当结构中有一个字符串时才使用它。谢谢你治愈了我的derp。
    【解决方案2】:
    • char 是 2 个字节或 16 位 Unicode 字符(U +0000 到 U +ffff)
    • char [] 是指针类型
    • int 是 4 个字节

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

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2021-12-11
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2017-08-22
      • 2020-05-09
      • 1970-01-01
      • 2018-12-24
      相关资源
      最近更新 更多