Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位/字节转换_C#_.net_Byte_Bit - Fatal编程技术网

C# 位/字节转换

C# 位/字节转换,c#,.net,byte,bit,C#,.net,Byte,Bit,长度为10个字符的.NET字符串有多少位?(.NET字符串是UTF-16,对吗?如果您说的是纯Unicode-16,那么: 10个字符=20个字节=160位 这确实需要一个上下文才能正确回答。在32位系统上: 4 bytes = Type pointer (Every object has one of these) 4 bytes = Lock (One of these too!) 4 bytes = Length

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

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

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

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

在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位系统上锁是否增长到64位。我希望不会,但你永远不会知道。因此,64位结构开销在16-20字节之间(与32位上的12字节相反)

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

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

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


这一切都归结于如何定义字符以及如何存储数据

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

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


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

哦,如果你想走这条路,没有锁,而是vtable。这很迂腐,但是。。。难道没有字符串实习吗?@Gonzalo,vtable是第一个“类型指针”(比vtable多得多)。你确定没有锁吗?对不起,大多数数数位的人都很迂腐。:-)我在看Mono的实现。实际上,前8个字节是vtable和lock。你说得对。你是说在内存中还是序列化后在磁盘上?你是说实习还是正常?32位还是64位?请记住,Unicode有多个16位编码。这里所说的是UCS-2,它总是每个字符使用2个字节。另一方面,UTF-16使用一个或两个字节对编码代码点,因此存储10个字符可能需要20多个字节。同样,这取决于你对角色的定义。
int numbits = System.Text.Encoding.Unicode.GetByteCount(str)*8 //returns 160