【问题标题】:Fastest way to convert one encoding to another将一种编码转换为另一种编码的最快方法
【发布时间】:2020-11-22 11:20:47
【问题描述】:

所以我正在读取一个可以以任何编码方式编码的文件。但是对于这个例子,让我们说 UTF-16。我需要以 BYTES 格式读取文件(所以使用 FileStream,而不是 StreamReader),并以 1MB 为单位,然后将 UTF-16 字节缓冲区转换为 UTF8 字节缓冲区。

我现在在做什么:

char[] charBuffer = new char[bufferSize];
Encoding.Unicode.GetChars(utf16Buffer, 0, read, charBuffer, 0);
byte[] utf8Array = new byte[Encoding.UTF8.GetByteCount(charBuffer, 0, charsRead)];
int numBytes = Encoding.UTF8.GetBytes(charBuffer, 0, charsRead, utf8Array, 0);

//Do something with utf8Array
//This is what Encoding.Convert does in the background.

这实际上并没有那么慢,但我想知道是否有更快的方法。谢谢。

【问题讨论】:

  • 总有更快的方法。您需要考虑的问题是这是否对您来说足够快
  • 你是对的。这对我来说可能已经足够快了。但是,我想知道我是否在做一些非常愚蠢的事情(比如在字节之间执行额外的转换)。但是,如果有一种方法可以更快地做到这一点,那就太好了。

标签: c# .net unicode encoding utf-8


【解决方案1】:

是的,有一种更快的方法。您可以使用多个线程来处理您的块。为了避免破坏缓冲区的顺序,您需要将缓冲区的索引传递给每个线程,并让它们使用该线程编辑同一个集合。

【讨论】:

  • 如何从多个线程读取同一个文件?
  • 好吧,我不是指那个。我以为你在谈论编码。我现在正在做一个实现。
  • 花了这么长时间.. 但我测试了一个实现。它是如此复杂,我仍然没有做对。只是稍微快一点。这样做确实没有任何好处。
  • 我有一个 FileStream 来读取字节。然后,如果文件是 UTF8,我直接将数据添加到我的“集合”中。如果它是不同的编码,那么我必须将其转换为 UTF8。我测试了生产者-消费者模式,但直接 utf8 的性能仅略有提高。我希望 UTF-16 到 UTF8 的转换会更好。
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多