为什么字符的存储大小似乎会发生变化
本文关键字:变化 字符 存储 为什么 | 更新日期: 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的答案。