Rust разделить вектор байтов на определенные байты

#rust

#Ржавчина

Вопрос:

У меня есть файл, содержащий информацию, которую я хочу загрузить в приложение. Файл содержит некоторую информацию заголовка в виде строки, затем несколько записей, которые заканчиваются на ‘;’ Некоторые записи используются для разных типов и поэтому длина является переменной, но все переменные разделены на ‘,’

Пример:

 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<u8>
  • Поместите его в строку (не могу сделать это напрямую, потому что в элементах, которые меня не интересуют, могут быть проблемы с UTF-8)
  • Разделите его на Vec<amp;str> с помощью ‘;’
  • Передавайте строки функциям в зависимости от их типа
  • Разделите его на Vec с помощью ‘ n’
  • Разделите его на Vec с помощью ‘,’
  • Считываю нужные мне данные и интерпретирую их из строк (например, str::from_str_radix)
  • Создайте структуру и верните ее

Похоже, это не тот путь, поскольку я начинаю с байтов, выделяю их как строку, а затем снова выделяю числа для большинства значений.

Итак, мой вопрос:

Могу ли я разделить Vec<u8> на несколько векторов, разделенных ‘;’ (байт 59), разделить их еще на ‘n’ и разделить это еще на ‘,’. Я предполагаю, что было бы более эффективно применять байты непосредственно к правильному типу данных. Или мое беспокойство неверно?

Комментарии:

1. Это звучит как задание для vec.split

2. @IvanC vec.split отвечает на заголовок, но я не думаю, что это решение. Мне кажется, что решение заключается в синтаксическом анализе, по крайней мере, ad-hoc, если не используется «правильная» библиотека синтаксического анализатора. Кроме того, вы не можете разделить a Split , поэтому вам придется изобрести схему для сопряжения разделителя разделения, чтобы узнать ваши 3 уровня границ, что в основном является специальным синтаксическим анализом, за исключением плохого.

3. Вы точно настроены на формат конфигурации, который используете? Возможно, вы захотите изучить некоторые типизированные, легко сериализуемые форматы.

4. Я настроен на формат, потому что я прочитал файл из стороннего программного обеспечения

Ответ №1:

Могу ли я разделить Vec на несколько векторов, разделенных ‘;’ (байт 59), разделить их дальше на ‘ n’ и разделить это дальше на ‘,’.

Обычно это не сработает, если другие байты могут появляться в других местах, например, встроенных в строки.

Тогда возникает также вопрос о том, как кодируются строки, существуют ли escape-последовательности и т. Д.

Я предполагаю, что было бы более эффективно применять байты непосредственно к правильному типу данных. Или мое беспокойство неверно?

Чтение всего файла в память, а затем выполнение нескольких копий из одного Vec в другой Vec и так далее будет медленнее, чем один проход с помощью какого-либо конечного автомата. Не говоря уже о том, что это сделает работу с файлами размером больше памяти чрезвычайно медленной или невозможной.

Я бы не стал беспокоиться о производительности, пока у вас не будет работающего алгоритма, в частности, если вам приходится работать с недокументированным, нетривиальным сторонним форматом, и у вас нет опыта чтения двоичных форматов.