Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[derive(Debug, Default)]
- struct Checksum(Option<(u8, u8)>);
- impl Checksum {
- fn push(&mut self, data: u8) {
- let (ck_a, ck_b): &mut (u8, u8) = self.0.get_or_insert((0, 0));
- *ck_a = ck_a.wrapping_add(data);
- *ck_b = ck_b.wrapping_add(*ck_a);
- }
- fn take(&mut self) -> (u8, u8) {
- self.0.take().unwrap_or((0, 0))
- }
- }
- pub fn calculate_checksum(buf: &[u8], offset: usize) -> (u8, u8) {
- let mut ck_a: u8 = 0;
- let mut ck_b: u8 = 0;
- let len = buf.len() - 2;
- for i in buf.iter().take(len).skip(offset) {
- ck_a = ck_a.wrapping_add(*i);
- ck_b = ck_b.wrapping_add(ck_a);
- }
- (ck_a, ck_b)
- }
- fn main() {
- let vals: Vec<u8> = (0..100).collect();
- let mut ckobj = Checksum::default();
- let ck0 = {
- for v in &vals[..vals.len()-2] {
- ckobj.push(*v);
- }
- ckobj.take()
- };
- let ck1 = calculate_checksum(&vals, 0);
- assert_eq!(ck0, ck1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement