1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
pub fn verify_prefix_len(prefix: &[u8], prefix_len: u8) -> bool {
let full_bytes = (prefix_len / 8) as usize;
let remaining_bits = prefix_len % 8;
let bytes = full_bytes + if remaining_bits != 0 { 1 } else { 0 };
if bytes > prefix.len() {
return false;
}
if remaining_bits != 0 {
let last_byte_mask = 0xff >> remaining_bits;
if prefix[full_bytes] & last_byte_mask != 0 {
return false;
}
}
prefix[bytes..].iter().all(|&b| b == 0)
}
pub fn matches_prefix(buf1: &[u8], buf2: &[u8], prefix_len: u8) -> bool {
let full_bytes = (prefix_len / 8) as usize;
let remaining_bits = prefix_len % 8;
let bytes = full_bytes + if remaining_bits != 0 { 1 } else { 0 };
if bytes > buf1.len() || bytes > buf2.len() {
return false;
}
if remaining_bits != 0 {
let last_byte_mask = 0xff << (8 - remaining_bits);
if (buf1[full_bytes] ^ buf2[full_bytes]) & last_byte_mask != 0 {
return false;
}
}
buf1[..full_bytes].iter().eq(buf2[..full_bytes].iter())
}
pub fn slice_to_u16(buf: &[u8]) -> u16 {
((buf[0] as u16) << 8) | (buf[1] as u16)
}
pub fn u16_to_slice(short: u16, slice: &mut [u8]) {
slice[0] = (short >> 8) as u8;
slice[1] = (short & 0xff) as u8;
}