Skip to main content

stackforge_core/utils/
padding.rs

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