Запись строки C # в предварительно выделенный неуправляемый буфер с использованием кодировки UTF8 - PullRequest
1 голос
/ 31 января 2012

Мне нужно записать строку C # в предварительно выделенный неуправляемый буфер, закодированный как Utf8. Перед ответом, пожалуйста, прочитайте следующие требования :

  • Нет новые выделения (поэтому, пожалуйста, не направляйте меня к ответам, связанным с созданием байтовых массивов или другими экземплярами)
  • Нет Переход к неуправляемому коду (без pinvoke / calli)

В настоящее время я использую OpCodes.Cpblk для копирования необработанных строк из C # в неуправляемые буферы, используя 16-битные символы. Это дает мне примерно ту же производительность, что и использование неуправляемого memcpy в архитектуре x64, и мне действительно нужно, чтобы пропускная способность была близка к этому.

Я рассматриваю исправление строки как char * и итерацию по ней, но реализация кодера без таблиц переходов была бы громоздкой и менее оптимальной, когда дело доходит до производительности .

1 Ответ

6 голосов
/ 01 февраля 2012

Используйте небезопасную перегрузку

public override unsafe int GetChars(byte* bytes, int byteCount, char* chars, int charCount)

класса UTF8Encoding.Вам нужно указать указатели на строку и байтовый буфер, который будет получать символы.Он скопирует в него символы UTF-8.Распределения не будет, но для этого потребуется небезопасный код.

...