zus_common/
codec_utils.rs1#[inline]
20pub fn calculate_header_crc16(fields: &[u64]) -> u16 {
21 let mut crc: u16 = 0;
22 for &field in fields {
23 crc = crc.wrapping_add(field as u16);
24 }
25 crc
26}
27
28#[inline]
33pub fn calculate_data_crc32(data: &[u8]) -> u32 {
34 let crc = crc::Crc::<u32>::new(&crc::CRC_32_ISO_HDLC);
35 let mut digest = crc.digest();
36 digest.update(data);
37 digest.finalize()
38}
39
40#[inline]
45pub fn calculate_data_crc16(data: &[u8]) -> u16 {
46 calculate_data_crc32(data) as u16
47}
48
49pub mod flags {
51 pub const COMPRESSED: u8 = 0x01;
53 pub const ENCRYPTED: u8 = 0x02;
55 pub const EXTRA_DATA: u8 = 0x04;
57 pub const DATA_FRAG: u8 = 0x04;
59}
60
61pub mod msg_types {
63 pub const REQUEST: u8 = 1;
65 pub const RESPONSE: u8 = 2;
67 pub const NOTIFY: u8 = 3;
69 pub const SYS_RESPONSE: u8 = 4;
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn test_header_crc16_calculation() {
79 let fields: &[u64] = &[0xD3A7, 0x0000, 0x12345678, 0x0708, 0x01, 0x00, 0x03E8, 0x1388, 0x03E7];
81 let crc = calculate_header_crc16(fields);
82 assert!(crc > 0);
83
84 let fields_large: &[u64] = &[0xFFFF, 0xFFFF];
86 let crc_wrap = calculate_header_crc16(fields_large);
87 assert_eq!(crc_wrap, 0xFFFE); }
89
90 #[test]
91 fn test_data_crc32() {
92 let data = b"hello world";
93 let crc = calculate_data_crc32(data);
94 assert!(crc > 0);
95
96 let crc2 = calculate_data_crc32(data);
98 assert_eq!(crc, crc2);
99
100 let crc3 = calculate_data_crc32(b"hello World");
102 assert_ne!(crc, crc3);
103 }
104
105 #[test]
106 fn test_data_crc16() {
107 let data = b"test data for crc";
108 let crc32 = calculate_data_crc32(data);
109 let crc16 = calculate_data_crc16(data);
110
111 assert_eq!(crc16, crc32 as u16);
113 }
114
115 #[test]
116 fn test_empty_data_crc() {
117 let empty: &[u8] = &[];
118 let crc32 = calculate_data_crc32(empty);
119 let crc16 = calculate_data_crc16(empty);
120
121 assert_eq!(crc32, 0); assert_eq!(crc16, 0);
124 }
125}