Skip to main content

stackforge_core/utils/
padding.rs

1//! Padding and alignment utilities.
2
3/// Pad data to a minimum length with zeros.
4pub fn pad_to(data: &[u8], min_len: usize) -> Vec<u8> {
5    if data.len() >= min_len {
6        data.to_vec()
7    } else {
8        let mut padded = data.to_vec();
9        padded.resize(min_len, 0);
10        padded
11    }
12}
13
14/// Pad data to align to a boundary.
15pub fn align_to(data: &[u8], alignment: usize) -> Vec<u8> {
16    let padded_len = (data.len() + alignment - 1) / alignment * alignment;
17    pad_to(data, padded_len)
18}
19
20/// Calculate the minimum Ethernet frame size (including padding).
21pub fn ethernet_min_frame(data: &[u8]) -> Vec<u8> {
22    // Minimum Ethernet frame is 64 bytes (including 4-byte FCS)
23    // Without FCS, it's 60 bytes
24    pad_to(data, 60)
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    #[test]
32    fn test_pad_to() {
33        let data = [1, 2, 3];
34        let padded = pad_to(&data, 6);
35        assert_eq!(padded, vec![1, 2, 3, 0, 0, 0]);
36
37        // No padding needed
38        let padded = pad_to(&data, 2);
39        assert_eq!(padded, vec![1, 2, 3]);
40    }
41
42    #[test]
43    fn test_align_to() {
44        let data = [1, 2, 3, 4, 5];
45        let aligned = align_to(&data, 4);
46        assert_eq!(aligned.len(), 8);
47        assert_eq!(&aligned[..5], &[1, 2, 3, 4, 5]);
48    }
49
50    #[test]
51    fn test_ethernet_min_frame() {
52        let data = vec![0u8; 20];
53        let frame = ethernet_min_frame(&data);
54        assert_eq!(frame.len(), 60);
55    }
56}