Forum Programmation.autre [Rust] : lire des données de type i8 depuis un fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
3
22
oct.
2018

Bonjour.

Suite à une discussion récente à propos de Rust sur ce forum, ma curiosité a été piquée et j'ai décidédé de m'y mettre. Je bloque cependant sur un problème et je sollicite votre aide pour pouvoir m'en sortir.

Je suis en train de tenter de lire le contenu d'un fichier qui contient plusieurs types de données. En gros j'essaie de désérialiser ces données.

J'ai lu mes données dans un buffer d'u8:

    let mut header = [0u8; HEADER_SIZE];

    // Opening file
    let metadata = fs::metadata(filename).expect("File not found.");
    let filelength = metadata.len();

    let mut f = File::open(filename).expect("File not found !!");
    // Read header
    f.read_exact(&mut header).expect("Error reading file");

Une partie de ces données sont des chaines de caractères de type C (terminée par un zero)que j'ai converti en String de la façon suivante:

fn  to_utf8_string(s: Vec <u8>) -> String {
    let x = s.as_ptr();
    let y = unsafe {CStr::from_ptr(x as *mut i8).to_string_lossy()};
    String::from(y)
}

Ce n'est peut-être pas la meilleure façon de faire, mais ça marche, et rien que chercher à faire ça m'a pris beaucoup de temps, mais j'ai appris beaucoup de choses.

Maintenant, une partie de mes données doit être interprétée comme une série de i8. Je voudrais les récupérer si possible en faisant un truc qui ressemblerait à ce que j'ai fait pour une String (je ne nommerai pas forcément la fonction ainsi, c'est juste pour avoir une idée):

fn  to_i8(s: Vec <u8>) -> Vec <i8> {
    let x = s.as_ptr();
    ???? 
}

Je ne sais pas si c'est l'heure qui commence à s'avancer ou le manque de sommeil de cette nuit (3 ou 4 heures d'un sommeil très léger), mais je cale et je commence à en avoir marre de tourner en rond (ça fait plus d'1 heure que je cherche sur le net sans trouver de piste). Auriez-vous SVP des idées pour me guider ? Je ne demande pas forcément une solution toute faite, mais des pistes/explications pour que je puisse apprendre.

Pour vous donner une idée de mon niveau en rust, je débute. J'ai lu et exécuté les exemples des 9 premiers chapitres du rust book, mais comme je commençais à en avoir un peu marre d'exemples bidons, je me suis dit que j'en savais assez pour commencer un truc un peu plus intéressant, et j'ai attaqué un lecteur de fichier mod ( c'est un truc que j'avais commencé à faire il y a bien deux dizaines d'années pour m'améliorer en C++, je trouveque c'est un très bon exercice). J'ai parcouru le chapitre 12 du livre cité précédemment pour apprendre à lire des fichiers (je reviendrai dessus plus tard, je n'ai que survolé cette partie).

Je n'ambitionne pas d'écrire un player (enfin, pas pour le moment): dans un premier temps je cherche juste à lire le fichier et à représenter les données en mémoire par diverses structures: ça me permet de mettre en pratique ce que j'ai lu jusqu'ici. C'est plus un exercice concret me permettant de graver dans ma tête les concepts de base du langage, de me familiariser avec. Une fois que j'aurai réussi à lire le fichier et à le structurer en mémoire, je continuerai la suite de ma lecture (et je reprendrai certainement ce que j'ai fait pour l'améliorer). mais qui sait ? Peut-être que j'aurai l'envie et le temps d'aller jusqu'au bout et d'avir un player de fichier mod en ligne de commande opérationnel ?

  • # kaitai struct ?

    Posté par  . Évalué à 2.

    je n'ai pas lu dans le détail ton message. Mais j'aurai tendance à lire les formats binaires assez complexes avec Kaitai-struct dont il existe un portage Rust : https://github.com/kaitai-io/kaitai_struct_rust_runtime

    • [^] # Re: kaitai struct ?

      Posté par  . Évalué à 3.

      Merci pour la suggestion, cependant mon objectif est d'apprendre à le faire sans utiliser des outils externes. Il est clair que si je voulais avoir un truc fiable, je ne réinventerais pas la roue, mais là c'est juste pour apprendre à jongler avec les types en Rust (mais c'est peut-être un peu trop high level pour le moment ???).

  • # Je pense que je ne suis pas assez avancé dans ma lecture ...

    Posté par  . Évalué à 3. Dernière modification le 23 octobre 2018 à 11:19.

    Après une bonne nuit de sommeil, j'ai les idées plus claires. J'ai reparcouru le sommaire du rust book, et je pense que la solution à mon problème se trouve dans la partie unsafe rust.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.