From b135077b8f48220415abe71bbe15b1ad4c78db93 Mon Sep 17 00:00:00 2001 From: Marrub Date: Sun, 17 Feb 2019 21:16:01 -0500 Subject: [PATCH] don't use casts like that --- src/durandal/bin.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/durandal/bin.rs b/src/durandal/bin.rs index b5e0aba..35c8cb9 100644 --- a/src/durandal/bin.rs +++ b/src/durandal/bin.rs @@ -4,14 +4,14 @@ use crate::durandal::err::*; use serde::Serialize; use std::{fmt, num::NonZeroU16, slice::SliceIndex}; -/// Returns a byte array from `b` at `i`. +/// Returns a `[u8]` from `b` at `i`. pub fn c_data(b: &[u8], i: I) -> ResultS<&>::Output> where I: SliceIndex<[u8]> { ok!(b.get(i), "not enough data") } -/// Returns a byte from `b` at `i`. +/// Returns a `u8` from `b` at `i`. pub fn c_byte(b: &[u8], i: usize) -> ResultS { match b.get(i) { @@ -70,6 +70,16 @@ pub fn o_u32b(b: &[u8], i: usize) -> Option } } +/// Returns a big-endian `i32` from `b` at `i`. +pub fn o_i32b(b: &[u8], i: usize) -> Option +{ + if i + 3 < b.len() { + Some(i32::from_be_bytes([b[i], b[i + 1], b[i + 2], b[i + 3]])) + } else { + None + } +} + /// Returns a big-endian `u16` from `b` at `i`. pub fn o_u16b(b: &[u8], i: usize) -> Option { @@ -80,12 +90,13 @@ pub fn o_u16b(b: &[u8], i: usize) -> Option } } -/// Returns a big-endian `i32` from `b` at `i`. -pub fn o_i32b(b: &[u8], i: usize) -> Option +/// Returns a big-endian `i16` from `b` at `i`. +pub fn o_i16b(b: &[u8], i: usize) -> Option { - match o_u32b(b, i) { - Some(n) => Some(n as i32), - None => None, + if i + 1 < b.len() { + Some(i16::from_be_bytes([b[i], b[i + 1]])) + } else { + None } } @@ -124,7 +135,7 @@ impl ObjID { match self.0 { None => None, - Some(n) => Some(n.get()), + Some(n) => Some(n.get() - 1), } } }