2009-11-11 139 views
2

長度爲10個字符的.NET字符串有多少位? (.NET字符串是UTF-16,是嗎?)位/字節轉換

+2

你的意思是在內存中或序列化後的磁盤上?你是指Interned還是正常? 32位或64位? – 2009-11-11 05:55:39

回答

1

如果是指純的Unicode-16則:

10個字符= 20個字節= 160個比特

這確實需要一個上下文,以得到適當的回答。

+0

請記住,Unicode有多個16位編碼。你在這裏談論的是UCS-2,它每個字符總是使用2個字節。另一方面,UTF-16使用一對或兩對字節對碼位進行編碼,因此可能需要超過20個字節來存儲10個字符。再次,這取決於你對角色的定義。 – Trillian 2009-11-11 15:52:33

+0

上帝保佑!爲什麼Unicode很複雜! – 2009-11-11 20:23:27

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位的64位系統。我有點希望沒有,但你永遠不知道。因此,64位結構的開銷是16-20字節(與32位的12字節相反)。

+0

哦,如果你想要走這條路線,那就沒有鎖定,而是一個虛擬表格。 – Gonzalo 2009-11-11 05:55:20

+0

嗯,這是迂腐的,但是...是不是有正在進行的串聯實習? – 2009-11-11 05:56:32

+0

@Gonzalo,vtable是第一個「類型指針」(不僅僅是一個vtable)。你確定沒有鎖嗎? – 2009-11-11 05:57:24

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 
0

你存儲數據的這一切都歸結到你如何定義角色,以及如何。例如,如果您從用戶的角度將字符定義爲單個字母,則它可以超過2個字節,例如:Å是兩個Unicode代碼點(U + 0041 U + 030A,Latin Capital A +組合環以上),因此需要兩個.net字符或4個字節的int UTF-16。

現在,即使你在談論10個.net的char元素,如果它在內存中,你有一些對象開銷(已經提到過)和一些對齊開銷(在32位系統上,一切都必須對齊到4字節邊界,在64位的規則更復雜),所以你最後可能有一些空的字節。

如果您正在討論的數據庫或文件比每個數據庫和文件系統都有其自身的開銷。