Ce face str::bytes
bytes() parcurge textul octet cu octet (u8), iar as_bytes() îți dă direct felia &[u8], pe care o poți indexa: s.as_bytes()[0]. Niciuna nu copiază textul.
Lucrul pe octeți este potrivit pentru formate care folosesc doar ASCII (coduri, cifre, protocoale) și pentru funcții care cer octeți (scriere în fișiere, sume de control). Pentru litere românești folosește chars(): un ș apare ca doi octeți separați (200 și 153).
Ce returnează
bytes: iterator de u8. as_bytes: &[u8] împrumutat.
Exemple
Exemplul 1: Octeți și caractere, comparat
fn main() {
let s = "Iași";
let octeti: Vec<u8> = s.bytes().collect();
let litere: Vec<char> = s.chars().collect();
println!("bytes: {octeti:?}");
println!("chars: {litere:?}");
println!("as_bytes: {:?}, primul octet: {}", s.as_bytes(), s.as_bytes()[0]);
}
Rezultat
bytes: [73, 97, 200, 153, 105]
chars: ['I', 'a', 'ș', 'i']
as_bytes: [73, 97, 200, 153, 105], primul octet: 73
Exemplul 2: Suma cifrelor dintr-un cod, pe octeți
Cifrele ASCII au codurile 48..57, deci b - b'0' dă valoarea cifrei.
fn main() {
let cod = "RO-4071";
let suma: u32 = cod
.bytes()
.filter(|b| b.is_ascii_digit())
.map(|b| (b - b'0') as u32)
.sum();
println!("suma cifrelor din {cod}: {suma}");
}
Rezultat
suma cifrelor din RO-4071: 12
Greșeli frecvente
- Transformi fiecare octet în
charcub as charpe un text cu diacritice:șdevine două caractere fără sens (Èși un caracter de control).
Comenzi înrudite
str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.String::into_bytes: Transformă String-ul în Vec<u8> cu octeții lui UTF-8, fără copiere; String-ul este consumat.String::from_utf8: Creează un String din octeți: from_utf8 verifică UTF-8 și dă eroare; from_utf8_lossy înlocuiește octeții greșiți cu �.String::len: Lungimea textului în OCTEȚI (nu în litere) și verificarea dacă textul e gol. Pentru litere: chars().count().