使用UTF8编码将C#字符串写入预分配的非托管缓冲区

Jac*_*ter 1 c# clr unmanaged utf-8 unmanaged-memory

我需要将C#字符串写入编码为Utf8的预分配非托管缓冲区.回答之前,请阅读以下要求:

  • 没有新的分配(所以请不要指导我涉及创建字节数组或其他实例化的答案)
  • 没有过渡到非托管代码(没有pinvoke/calli)

目前,我正在使用OpCodes.Cpblk将原始字符串从C#复制到使用16位字符的非托管缓冲区.这给了我与在x64架构上使用非托管memcpy大致相同的性能,我真的需要吞吐量接近它.

我正在考虑字符串固定char*并对其进行迭代,但实现不带跳转表的编码器既麻烦又不太理想.

usr*_*usr 6

使用不安全的过载

public override unsafe int GetChars(byte* bytes, int byteCount, char* chars, int charCount)
Run Code Online (Sandbox Code Playgroud)

UTF8Encoding类的.您需要指定指向字符串的指针和将接收字符的字节缓冲区.它会将UTF-8字符复制到其中.不会发生任何分配,但需要不安全的代码.

  • 我不明白为什么人们在没有给出解释的情况下贬低某些东西.即使是简短的一句话评论也可能非常有用. (4认同)