【问题标题】:Fastest way to convert byte[] to string?将 byte[] 转换为字符串的最快方法?
【发布时间】:2014-06-08 00:00:44
【问题描述】:

我需要在 C# 和 Unity 中将字节 [] 转换为字符串,而不会丢失太多每秒帧数。我目前正在使用 WWW 类来获取文本文件,但是当我使用 WWW.text 时,由于文件太大并导致 FPS 下降。有什么方法可以逐步进行转换,而不会延迟太久。

WWW file = new WWW(path);
yield return file;
string text= file.text;

我用它来读取一个完整的文件(一个 .OBJ),我需要读取所有文本。行到行或所有文本到一个字符串后拆分。为了在不降低 FPS 的情况下阅读文本,我这样做了。

WWW file = new WWW(path);
yield return file;
byte[] text= file.bytes;

如果文件太大,WWW.text,丢弃 FPS,那么我需要使用 WWW.bytes。在 Unity 中 useyield 返回 null;处理另一个帧。如果进程需要太多时间来执行,则丢弃 FPS(如果是 WWW.text);

Ex 文件:http://people.sc.fsu.edu/~jburkardt/data/obj/cessna.obj

【问题讨论】:

  • 那么,你想怎么转换呢?字符串和字节数组是完全不同的野兽。
  • 文件实际上是文本,还是二进制数据?
  • 是一个文本文件,但是是一个在线网址。例如:people.sc.fsu.edu/~jburkardt/data/obj/cessna.obj
  • yield 的使用很奇怪...看起来像 await
  • 团结一致的是单线程。然后你使用yield return null 来处理另一个帧。另一种形式是WWW file = new WWW(path); while (!file.isDone) { yield return null; } byte[] text= file.bytes;

标签: c# unity3d bytearray unityscript


【解决方案1】:

我猜 WWW 在内部将请求结果存储为字节数组,并在您访问 text 字段时将其转换为字符串(那么这真的是一个字段吗?)。

因此,无论如何,将该字节转换为字符串都需要分配内存并使用正确的编码来处理该字节数组。

最好的办法是直接从字节数组中提取数据,而不是先将其转换为大字符串。

编辑

或者,您可以将字节数组包装在MemoryStream 中,然后使用适当的编码将其再次包装在StreamReader 中(我猜OBJ 文件是纯ASCII)。

您的文件将在您阅读时逐步转换。

在你的处理循环中使用yield 模式,它应该很好!

【讨论】:

  • 我认为这是一个解决方案,但是,我如何每次提取一行。
  • 使用 StringReader,如果它在平台上可用。
  • 是.Net Framework 3.5,但我需要读取一个字节数组中的一行。不在一个字符串中。
  • @user3541917 在数组中搜索等于 13 的下一个字节(回车)。
【解决方案2】:

这样试试:

WWW file = new WWW(path);
while(!file.isDone)
{
    yield return new WaitForSeconds(0.1f);
}
string text = file.text;

【讨论】:

  • 一个慢进程是string text = file.text;
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2013-01-24
相关资源
最近更新 更多