2012-01-31 43 views
1

我需要將C#字符串寫入以Utf8編碼的預分配非託管緩衝區。 之前回答,請閱讀以下要求使用UTF8編碼將C#字符串寫入預分配的非託管緩衝區

  • 沒有新的分配(所以請不要告訴我去涉及創建字節數組或其他實例解答)
  • 轉換到非託管代碼(無pinvoke/calli)

目前,我使用OpCodes.Cpblk將原始字符串從C#複製到使用16位字符的非託管緩衝區。這使我在x64體系結構上使用非託管memcpy的性能大致相同,我真的需要吞吐量接近於此。

我正在考慮固定的字符串作爲字符 *和迭代,但沒有實現跳轉表編碼器將是既麻煩又達不到最佳,當涉及到性能。

+0

有沒有什麼理由不能用C++編寫它? – Gabe 2012-01-31 20:15:29

+0

如果我想避免過渡,使用C++將沒有區別 – 2012-01-31 21:25:27

+0

如果你用C++/CLR編寫它,那麼將不會有轉換。 – Gabe 2012-01-31 21:47:37

回答

6

使用不安全的超載

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

。您需要指定指向字符串的指針和將接收字符的字節緩衝區。它將複製UTF-8字符。沒有分配將會發生,但它需要不安全的代碼。

+4

我不明白爲什麼人們在沒有給出解釋的情況下降低了某些東西。即使是簡短的一句話評論也會非常有幫助。 – 2012-01-31 20:08:17

+0

我不明白爲什麼這是downvoted。您需要指定指向字符串的指針和將接收字符的字節緩衝區。它將複製UTF-8字符。 – usr 2012-01-31 20:12:55

+0

也許這是簡潔。正如我現在充實了答案,downvote已經過時,應該恢復。 – usr 2012-01-31 20:14:41

相關問題