gpt4 book ai didi

.net - 是否有将二进制数据打包成 UTF-16 字符串的标准技术?

转载 作者:行者123 更新时间:2023-12-04 02:54:39 25 4
gpt4 key购买 nike

(在 .NET 中)我将任意二进制数据存储在 byte[] (例如图像)中。现在,我需要将该数据存储在一个字符串中(旧 API 的“注释”字段)。 是否有标准技术?包装将此二进制数据转换为字符串? “打包”是指对于任何相当大的随机数据集,bytes.Length/2 与packed.Length 大致相同;因为两个字节或多或少是一个字符。

两个“明显”的答案不符合所有标准:

string base64 = System.Convert.ToBase64String(bytes)

不能非常有效地使用字符串,因为它只使用了大约 60,000 个可用字符中的 64 个字符(我的存储是 System.String)。与
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)

更好地利用字符串,但它不适用于包含无效 Unicode 字符的数据(例如不匹配的代理对)。 This MSDN article显示了这种精确(差)的技术。

让我们看一个简单的例子:
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 和 utf16_bytes 是相同的,因为原始字节是 UTF-16 字符串。使用 base64 编码执行相同的过程会得到 16 个成员的 base64_bytes 数组。

现在,使用无效的 UTF-16 数据重复该过程:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};

您会发现 utf16_bytes 与原始数据不匹配。

我已经编写了在无效 Unicode 字符之前使用 U+FFFD 作为转义符的代码;它有效,但我想知道是否有比我自己编写的技术更标准的技术。更不用说,我不喜欢捕获 DecoderFallbackException 作为检测无效字符的方式。

我想您可以将其称为“基本 BMP”或“基本 UTF-16”编码(使用 Unicode 基本多语言平面中的所有字符)。是的,理想情况下我会关注 Shawn Steele's advice并传递字节[]。


我将采用 Peter Housel 的建议作为“正确”答案,因为他是唯一接近建议“标准技术”的人。


编辑 base16k looks甚至更好。 Jim Beveridge 有一个 implementation .

最佳答案

我偶然发现了 Base16k阅读您的问题后。严格来说不是一个标准,但它似乎运行良好,并且很容易在 C# 中实现。

关于.net - 是否有将二进制数据打包成 UTF-16 字符串的标准技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com