【问题标题】:Rust split vector of bytes by specific bytesRust 按特定字节拆分字节向量
【发布时间】:2020-11-21 01:03:38
【问题描述】:

我有一个文件,其中包含我想在应用程序中加载的信息。该文件有一些标题信息作为字符串,然后是多个以“;”结尾的条目一些条目用于不同的类型,因此长度是可变的,但所有变量都用','分隔

例子:

\Some heading
\Some other heading

I,003f,3f3d00ed,"Some string",00ef,
0032,20f3
;

Y,02d1,0000,0000,"Name of element",
00000007,0,

00000000,0,
;

Y,02d1,0000,0000,"Name of element",30f0,2d0f,02sd,
00000007,0,

00000000,0,
;

I 是一种元素 Y是另一种元素

我想要实现的是,将元素放入不同的结构中以使用。大多数值是数字,但有些是字符串。

我能够实现的是:

  • 将文件导入为 Vec
  • 把它放在一个字符串中(不能直接这样做,因为我不感兴趣的元素中可能存在 UTF-8 问题)
  • 将其拆分为 Vec by ';'
  • 根据类型将字符串传递给函数
  • 通过 '\n' 将其拆分为 Vec
  • 通过','将其拆分为 Vec
  • 读出我需要的数据并从字符串中解释(例如str::from_str_radix)
  • 构建结构并返回它

这似乎不是要走的路,因为我从字节开始,将它们分配为字符串,然后再次为大多数值分配数字。

所以我的问题是:

我可以将 Vec 拆分成多个用 ';' 分隔的向量吗(字节 59),将这些进一步拆分为 '\n' 并进一步拆分为 ','。 我认为将字节直接应用于正确的数据类型会更有效率。还是我的担心有问题?

【问题讨论】:

  • 这听起来像是 vec.split 的工作
  • @IvanC vec.split 回答了标题,但我认为这不是解决方案。在我看来,解决方案似乎是解析,如果不使用“适当的”解析器库,至少是临时的。另外,您不能真正拆分Split,因此您必须发明一种方案来配对拆分分隔符以了解您的 3 级边界,这基本上是临时解析,除了不好。
  • 您是否对正在使用的配置格式一无所知?您可能想研究一些类型化、易于序列化的格式。
  • 我设置了格式,因为我从第三方软件读取文件

标签: rust


【解决方案1】:

我可以将 Vec 拆分成多个用 ';' 分隔的向量吗? (字节 59),将这些进一步拆分为 '\n' 并进一步拆分为 ','。

如果其他字节可能出现在其他地方,例如嵌入在字符串中,通常这是行不通的。

然后还有字符串如何编码、是否有转义序列等问题。

我认为将字节直接应用于正确的数据类型会更高效。还是我的担心有问题?

将整个文件读入内存,然后从一个Vec 复制到另一个Vec 和另一个等等,这将比使用某种状态机的单次传递要慢。更不用说它会使处理大于内存的文件变得极其缓慢或不可能。

在您拥有有效的算法之前,我不会担心性能问题,特别是如果您必须使用未记录的、重要的第三方格式,并且您没有阅读二进制格式的经验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多