7 votes

Rust offre-t-il un moyen d'analyser des nombres entiers directement à partir de données ASCII dans des tableaux d'octets (u8) ?

La rouille a FromStr Cependant, d'après ce que je peux voir, il n'accepte que les entrées de texte Unicode. Existe-t-il un équivalent pour [u8] des tableaux ?

Par "analyser", j'entends prendre des caractères ASCII et renvoyer un nombre entier, comme en C. atoi fait.

Ou est-ce que je dois...

  • Convertir le u8 en une chaîne de caractères, puis appeler FromStr .
  • Appel à la libc atoi .
  • Rédiger un atoi dans Rust.

Dans presque tous les cas, la première option est raisonnable, cependant il y a des cas où les fichiers peuvent être très grands, sans encodage prédéfini... ou contenir un mélange de binaire et de texte, où il est plus simple de lire les nombres entiers comme des octets.

9voto

Shepmaster Points 1732

Non, la bibliothèque standard ne dispose pas d'une telle fonctionnalité, mais elle n'en a pas besoin.

Comme indiqué dans les commentaires, les octets bruts peuvent être convertis en un format &str via :

  1. str::from_utf8
  2. str::from_utf8_unchecked

Aucun d'entre eux n'effectue d'allocation supplémentaire. La première garantit que les octets sont des UTF-8 valides, la seconde ne le fait pas. Tout le monde devrait utiliser la forme vérifiée jusqu'à ce que profilage prouve qu'il s'agit d'un goulot d'étranglement, puis utilisez la forme non cochée une fois qu'il a été prouvé que cela est sans danger.

Si des octets plus profonds dans les données doivent être analysés, une fonction tranche des octets bruts peuvent être obtenus avant la conversion :

use std::str;

fn main() {
    let raw_data = b"123132";

    let the_bytes = &raw_data[1..4];
    let the_string = str::from_utf8(the_bytes).expect("not UTF-8");
    let the_number: u64 = the_string.parse().expect("not a number");

    assert_eq!(the_number, 231);
}

Comme dans d'autres codes, ces lignes peuvent être extraites dans une fonction ou un trait pour permettre leur réutilisation. Cependant, une fois cette voie empruntée, il serait bon de se pencher sur l'une des nombreuses des caisses destinées à l'analyse syntaxique . C'est particulièrement vrai s'il est nécessaire d'analyser des données binaires en plus des données textuelles.

3voto

Markus Klein Points 271

Je ne connais pas de moyen dans la bibliothèque standard, mais peut-être que l'option atoi La cage d'escalier fonctionne pour vous ?

extern crate atoi;
use atoi::atoi;

let (number, digits) = atoi::<u32>(b"42 is the answer"); //returns (42,2)

Vous pouvez vérifier si le deuxième élément du tuple est un zéro pour voir si la tranche commence par un chiffre.

let (number, digits) = atoi::<u32>(b"x"); //returns (0,0)
let (number, digits) = atoi::<u32>(b"0"); //returns (0,1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X