2

长度为 10 个字符的 .NET 字符串有多少位?(.NET 字符串是 UTF-16,对吗?)

4

4 回答 4

7

在 32 位系统上:

4 bytes          = Type pointer (Every object has one of these)
4 bytes          = Lock         (One of these too!)
4 bytes          = Length       (Need the length)
2 * Length bytes = Data         (And the chars themselves)
=======================
12 + 2*Length bytes
=======================
96 + 16*Length bits

所以 10 个字符 = 256 位= 32 字节

我不确定 Lock 是否在 64 位系统上增长到 64 位。我有点希望不会,但你永远不知道。因此,64 位结构开销在 16-20 个字节之间(与 32 位上的 12 个字节相反)。

于 2009-11-11T05:53:29.217 回答
4

字符串中的每个字符大小为两个字节,因此如果您只是直接转换字符而不使用任何特定编码,答案是 string.Length * 2 * 8

否则结果取决于编码,你可以写:

int numbits = System.Text.Encoding.UTF8.GetByteCount(str)*8; //returns 80

或者

int numbits = System.Text.Encoding.Unicode.GetByteCount(str)*8 //returns 160
于 2009-11-11T05:54:27.763 回答
1

如果您说的是纯 Unicode-16,那么:

10 个字符 = 20 个字节 = 160 位

这确实需要一个上下文才能正确回答。

于 2009-11-11T05:50:15.740 回答
0

这一切都取决于您如何定义角色以及如何存储数据。

例如,如果您从用户的角度将字符定义为单个字母,它可以超过 2 个字节,例如这个字符:Å 是两个 Unicode 代码点(U+0041 U+030A,拉丁文大写 A + 组合环以上),因此它将需要两个 .net 字符或 4 字节 int UTF-16。

现在,即使您谈论的是 10 个 .net Char 元素,如果它在内存中,您也会有一些对象开销(已经提到过)和一些对齐开销(在 32 位系统上,所有内容都必须与 4 字节边界对齐,在 64 位规则更复杂)所以最后可能有一些空字节。

如果您谈论的是数据库或文件,那么每个数据库和文件系统都有自己的开销。

于 2009-11-11T15:38:43.807 回答