位/字节转换

时间:2009-11-11 05:49:15

标签: c# .net byte bit

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

4 个答案:

答案 0 :(得分: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字节

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果您正在谈论纯Unicode-16,那么:

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

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

答案 3 :(得分:0)

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

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

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

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