Было бы лучше иметь срез с одним элементом на адрес, либо 4-байтовыми массивами ([u8; 4]
), некоторой эквивалентной структурой (эй, Ipv4Addr
), либо просто u32
. К сожалению, я не думаю, что возможно переосмыслить &[u8]
с длиной, кратной 4, как &[[u8; 4]]
(а для других опций потребуется выравнивание). Вы можете сделать это преобразование, читая файл кусками, однако.
Итак, сначала в эквивалентном примере программы:
use std::net::Ipv4Addr;
fn main() {
let vec: Vec<Ipv4Addr> = vec![
[10, 0, 0, 0].into(),
[20, 0, 0, 0].into(),
[30, 0, 0, 0].into(),
];
println!("vec {:?}", vec);
let found = vec.binary_search(&Ipv4Addr::from_str("20.0.0.0").unwrap());
println!("found {:?}", found);
}
(детская площадка)
Тогда чтение из файла будет выглядеть примерно так:
let mut vec: Vec<Ipv4Addr> = vec![];
loop {
let mut address = [0; 4];
match f.read_exact(&mut address) {
Ok(()) => {},
Err(err) if err.kind() == ErrorKind::UnexpectedEof => break,
err => err?,
}
vec.push(address.into());
}
(хотя этот код немного слабый в том смысле, что он игнорирует любые конечные байты, которые не образуют кратное 4)
, где f
- это BufReader
вокруг файла.