2010-09-15 63 views

回答

4

當然,有許多方法可靠地將任意字節數組打包成Unicode字符,但它們都不是非常有效。非常不幸的是 ActiveDirectory會選擇使用Unicode來處理非文本性質的數據。這就像使用一個字符串來表示一個32位整數,或者像使用Nutella寫一封情書一樣。

我的建議是「安全地玩」,並使用基於ASCII的編碼,如base64。我建議這樣做的原因是因爲已經有一個內置的.NET實現這個:

var base64Encoded = Convert.ToBase64String(byteArray); 

var original = Convert.FromBase64String(base64Encoded); 

在理論上講,你能想出的編碼比這更有效的通過使更多的使用Unicode字符集。但是,爲了這樣做可靠,你需要知道很多有關Unicode的信息。

+0

+1感謝您指出我答案中的錯誤! – Venemo 2010-09-16 00:48:49

+4

爲Nutella情書+1 ...浪漫而美味! – 2010-09-16 00:50:28

+0

爲了公平對待MSFT,我還可以使用其他二進制屬性,但客戶希望我使用Unicode的「擴展屬性」。在其他地方也有Byte []。我喜歡Nutella情書。 +1 – LamonteCristo 2010-09-16 00:57:31

1

通常情況下,這將是在字節和Unicode文本之間進行轉換的方式:

// string from bytes 
System.Text.Encoding.Unicode.GetString(bytes); 

// bytes from string 
System.Text.Encoding.Unicode.GetBytes(bytes); 

編輯
但因爲不是每個可能的字節序列是一個有效的Unicode字符串,你應該使用的方法

// string from bytes 
Convert.ToBase64String(byteArray); 

// bytes from string 
Convert.FromBase64String(base64Encoded); 

(感謝@Timwi誰指出日:可以從任意字節序列創建一個字符串是的!)

+0

謝謝!我正在試着保持我的大腦清醒,同時我正在使用我的摩托車受傷的止痛藥。我*認爲*我應該知道這一點。完美無缺 – LamonteCristo 2010-09-15 23:28:41

+0

@ MakerOfThings7 - 別擔心,在我真正需要它之前,我也不知道。 :) – Venemo 2010-09-15 23:42:11

+1

**這個答案是完全錯誤的。**如果你使用這個,你將會丟失數據。 'Encoding.Unicode'封裝了UTF-16,並不是所有的字節數組都是有效的UTF-16。例如,考慮具有奇數字節的數組,或者帶有單獨代理的字節序列。它們都不是有效的UTF-16,並且會生成一個不會返回到原始字節數組的字符串。 – Timwi 2010-09-16 00:21:22

相關問題