incrémentation d'un compteur dans une boucle rust

a marqué ce sujet comme résolu.

Salut,
J’essaie Rust et je voulais essayer de parser un fichier .torrent, ce dernier est un dictionnaire composé de 4 type : dico, list, entier et string. chacun est délimité /encodé comme ceci :

dict : d<key><value>e  
list : l<values...>e  
entier : i<value>e  
string : taille_de_la_String:string 

Les clé et valeurs peuvent être n’importe quel valeur encodé parmis la liste ce dessus.

J’aimerais pour commencer, décoder uniquement les clés et trouver les valeurs associées (donc je décode pas encore les valeurs)

Pour l’instant je considère que le fichier est une suite de <string><valeur><string><valeur><string><valeur>… et j’essaie de parser tout ça de la manière suivante :

pub fn parse_dict(dic: &[u8]) -> std::io::Result<()> {
  if !dic.last().expect("Empty dico") == b'd' {
      return Err(std::io::Error::new(
          ErrorKind::InvalidData,
          "Dico doesn't start with a d prefix",
      ));
  }
  let dic = &dic[1..]; //remove the prefix d

  let mut end_of_value = Vec::<usize>::new();
  let mut i: usize = 0;
  end_of_value.push(0);

  for ch in dic {
      if ch == &b':' {
          let key_size = parse_string_size(&dic[*end_of_value.last().expect("No last inserted element")..i]);'
          let key = &dic[i+1..i+key_size+1];

          end_of_value.push(&i+key_size+1);
          let key = String::from_utf8_lossy(key).into_owned();
          println!("Key size : {}", key_size);
          println!("Key : {}", key);
      }

      i += 1;
  }

  Ok(())
}

Essentiellement je parcours tous mes u8 avec ma boucle for, à chaque fois je regarde si on a le début d’une string prefixé par ':’.
Je parse la longueur de la string en tant que usize (key_size).
Je lis key_size char après le délimiteur ':'

Mon problème c’est que i n’est pas toujours incrémenté lorsque la boucle tourne et je me retrouve à vouloir prendre une slice de la position 83 à 17, 17 étant i qui n’a pas été incrémenté. Et je ne comprend pas pourquoi i n’esst pas incrémenté à chaque itération de boucle.
Voici un playground fonctionel du code ci dessus.

PS: Je me rends aussi compte que je devrais sauter à la fin de la valeur pour éviter d’interpréter un : qui sera dans la valeur, je compte faire un compteur qui ajoute à la marque de fin la taille de l’élément valeur lorsque il le rencontre.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte