我正在尝试将Gzip序列化对象存储到Active Directory的“扩展属性”中,更多信息here。该字段是一个Unicode字符串,根据它的oM syntax为64。
将二进制blob存储为Unicode的最有效方法是什么?一旦我把它弄下来,剩下的就是小菜一碟。
答案 0 :(得分:4)
当然,有许多方法可以将任意字节数组可靠地打包成Unicode字符,但它们都不是非常有效。 非常不幸,ActiveDirectory会选择将Unicode用于本质上不是文本的数据。这就像使用字符串来表示32位整数,或者像使用Nutella来写一封情书一样。
我的建议是“安全地播放”并使用基于ASCII的编码,例如base64
。我推荐这个的原因是因为已经有一个内置的.NET实现:
var base64Encoded = Convert.ToBase64String(byteArray);
var original = Convert.FromBase64String(base64Encoded);
理论上,你可以通过使用更多的Unicode字符集来提出比这更有效的编码。但是,为了实现可靠,您需要了解相关的Unicode。
答案 1 :(得分: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 指出了这一点!)