(在.NET中)我有任意二进制数据存储在byte[](例如图像)。现在,我需要将该数据存储在string(旧 API 的“注释”字段)。有没有标准技术packing将此二进制数据转换为string?我所说的“打包”是指对于任何相当大且随机的数据集,字节.长度/2大约与包装长度;因为两个字节或多或少是一个字符。
这两个“显而易见”的答案并不满足所有标准:
string base64 = System.Convert.ToBase64String(bytes)
没有非常有效地利用string因为它只使用了大约 60,000 个可用字符中的 64 个(我的存储空间是系统字符串)。一起去
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
更好地利用string,但它不适用于包含无效 Unicode 字符的数据(例如不匹配的代理项对)。这篇 MSDN 文章 http://msdn.microsoft.com/en-us/library/ms172827.aspx显示了这种精确的(差的)技术。
让我们看一个简单的例子:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
在这种情况下bytes and utf16_字节是一样的,因为原来的bytes是一个 UTF-16 字符串。使用 Base64 编码执行相同的过程可得到 16 个成员base64_字节 array.
现在,使用无效的 UTF-16 数据重复该过程:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
你会发现utf16_字节与原始数据不符。
我编写了在无效 Unicode 字符之前使用 U+FFFD 作为转义符的代码;它有效,但我想知道是否有比我自己编写的技术更标准的技术。还别说,我不喜欢catching the 解码器回退异常作为检测无效字符的方式。
我想您可以将其称为“基本 BMP”或“基本 UTF-16”编码(使用 Unicode 基本多语言平面中的所有字符)。是的,理想情况下我会遵循肖恩·斯蒂尔的建议 http://blogs.msdn.com/shawnste/archive/2005/09/26/474105.aspx并传递byte[].
我将接受 Peter Housel 的建议作为“正确”答案,因为他是唯一接近建议“标准技术”的人。
罢工>
Edit base16k http://www.unicode.org/mail-arch/unicode-ml/y2004-m05/1671.html looks http://sites.google.com/site/markusicu/unicode/base16k甚至更好。吉姆·贝弗里奇有一个执行 http://qualapps.blogspot.com/2011/11/base64-for-unicode-utf16.html.