将缓冲区有效地表示为 unicode 字符串

Represent a buffer efficiently as unicode string

我有一个随机缓冲区。 我需要将它编码为 un​​icode 字符串(utf16 LE。如 windows 宽字符规范所使用),以便它可以用作 PWSTR。例如当调用 StringCchPrintfW

一个可能的解决方案是使用 base64。但是为了使它成为一个 unicode 字符串,我必须在每个字符后添加一个零字节,这在 space.

中效率低下

如果我只打印缓冲区,它可能包含将终止字符串的“\0”,或将影响格式的“%”(也许它可以被转义),或其他 unicode 字符将防止它被用于格式化。

生成要打印的字符串,最后解析的代码是用C#写的,但是buffer会在windowsC++中用到格式化,然后写到文件。

以下是我能想到的两种方法:

  • 最简单的方法:将每个字节转换为 UTF-16 wchar_t,方法是将 0x8000 与其值相加(即附加一个 0x80 字节)。效率只有50%,但至少你省去了base64转换,这会降低效率到37.5%。

  • 高效但复杂的方法:以 15 位块的形式读取数据(如果您的总位数不是 15 的倍数,则在末尾填充空位)。通过将 0x4000 添加到它的值来转换 UTF-16 字符中的每个块。然后添加值为 0xC000 + n 的最终 wchar_t,其中 n (0 <= n <= 14) 是最终块中的填充位数。换取更复杂的算法,你得到了非常好的效率:93.75%。

这两种方法都避免了在 UTF-16 格式字符串中使用二进制数据的所有危险:没有空字节,没有 '%' 字符,没有代理对,只有可打印字符(其中大部分是中文表意文字) .