假设我将值1025作为字节数组并将值1030作为usize。如果不对数组进行反序列化,该如何比较字节数组是更大,或更小还是相等?
我完全被困住了,我认为最简便的方法是获取字节数组的最大字节及其位置,然后对u32进行位移位,看看是否设置了字节中的任何位(如果不是,则字节数组更大)。
总之,我想编写一些函数来决定a> b,a
使用代码示例
fn is_greater(a: &[u8], b: usize) -> bool {
// a is LE, so reverse and get the largest bytes
let c = a.iter()
.enumerate()
.rev()
.filter_map(|(i, b)| ( if *b != 0 { return Some((i, *b)); } else { None }))
.collect::<Vec<(usize, u8)>>();
for (i, be) in c {
let k = (b >> (i * 8)) & 255;
println!("{}, {}", be, k);
return be as usize > k
}
false
}
编辑:应该澄清,字节数组可以是任何整数,无符号整数或浮点数。简单地,任何整数bincode :: serialize都可以序列化。
我还牢记要避免转换字节数组,应该在100000个字节数组上使用比较,因此我认为位操作是首选方法。
不需要所有这些额外的步骤。基本问题是要知道在字节数组中编码的整数是little endian
,big endian
还是native endian
。知道这一点,您可以使用usize::from_??_bytes
将固定大小的数组转换为整数。使用usize::from_??_bytes
从切片中获取固定大小的数组。
TryFrom
-trait
如果字节片小于8个字节,此函数将返回错误,在这种情况下,无法构造TryFrom
;您还可以转换为fn is_greater(b: &[u8], v: usize) -> Result<bool, std::array::TryFromSliceError> {
use std::convert::TryFrom;
Ok(usize::from_le_bytes(<[u8; 8]>::try_from(b)?) > v)
}
甚至usize
,将其转换为u32
,然后进行比较。另请注意,假设字节切片包含编码为u16
的整数,则此示例使用usize
。