我试图在需要将C#字符串转换为byte []的库中实现最大性能,然后再将它们发送到某个地方。
由于UTF8中的char最多占用4个字节,因此我目前的方法是预先分配一个大字节[]。当字符串到达进行编码时,我可以使用System.Text.Encoder来填充字节数组。如果字符串的char长度* 4大于我的缓冲区,我会分配一个新的(通过缓冲池优化),但这应该会很快变得相对罕见。
我对此解决方案的唯一问题是,System.Text.Encoder似乎没有接受字符串 - 只有char []。从字符串中检索char []涉及另一个看似不必要的副本。这是一个带有char指针的不安全版本,但我现在禁止在我的库中使用它。
作为旁注,StringWriter也执行UTF8转换,它维护一个内部缓冲区。这也是不合适的 - 我需要自己的缓冲区,因为我也编码其他数据类型(例如int)。
那么有没有人知道Encoder在哪里提供直接在String上工作的方法?
答案 0 :(得分:3)
查看Encoding类,它们包装了Encoder类。
听起来你应该坚持使用内置的文本编码,直到它们被证明是无效的。有一个UTF8Encoding.GetBytes(String, Int32, Int32, Byte[], Int32),它将把你的字符串直接写入你预先分配的字节数组。
还有一个UTF8Encoding.GetByteCount(String)可以在为它分配内存之前计算字节数组的大小。