una texto recorrer palabras matriz matrices letras hacer guardar como cadenas arreglo string rust

string - texto - ¿Rust proporciona una forma de analizar números enteros directamente desde datos ASCII en matrices de bytes(u8)?



recorrer string matlab (2)

Rust tiene FromStr , sin embargo, por lo que puedo ver, esto solo toma la entrada de texto Unicode. ¿Hay un equivalente a esto para las matrices [u8] ?

Por "analizar" me refiero a tomar caracteres ASCII y devolver un número entero, como lo hace C atoi .

O necesito yo tampoco ...

  • u8 matriz u8 en una cadena, luego llame a FromStr .
  • Llamar a atoi de libc.
  • Escribe un atoi en Rust.

En casi todos los casos, la primera opción es razonable, sin embargo, hay casos en que los archivos pueden ser muy grandes, sin codificación predefinida ... o contener texto y binarios mezclados, donde es más fácil leer números enteros como bytes.


No, la biblioteca estándar no tiene dicha función, pero no la necesita.

Como se indica en los comentarios, los bytes sin formato se pueden convertir a &str través de:

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

Ninguno de estos realiza asignaciones adicionales. El primero asegura que los bytes son válidos UTF-8, el segundo no. Todo el mundo debería usar el formulario verificado hasta que el perfil demuestre que se trata de un cuello de botella, luego use el formulario no verificado una vez que se haya comprobado que es seguro hacerlo.

Si los bytes más profundos en los datos necesitan ser analizados, se puede obtener una porción de los bytes sin formato antes de la conversión:

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); }

Como en otros códigos, estas líneas se pueden extraer en una función o rasgo para permitir la reutilización. Sin embargo, una vez que se sigue ese camino, sería una buena idea buscar en una de las muchas cajas grandes destinadas a analizar . Esto es especialmente cierto si hay una necesidad de analizar datos binarios además de datos textuales.


No sé de ninguna manera en la biblioteca estándar, pero tal vez la caja atoi funcione para usted.

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

Puede verificar si el segundo elemento de la tupla es cero para ver si el corte comienza con un dígito.

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