Rust 按位操作,将u32与字节数组进行比较

Rust 按位操作,将u32与字节数组进行比较,rust,comparison,bit-manipulation,byte,bitwise-operators,Rust,Comparison,Bit Manipulation,Byte,Bitwise Operators,假设值1025作为字节数组,值1030作为usize。在不反序列化的情况下,如何比较字节数组是否更大、更小或相等 我完全被卡住了,我认为最简单的方法是获取字节数组中最大的字节,它的位置,然后对u32进行位移位,看看字节中是否设置了任何位,如果不是,字节数组是否更大 简而言之,我想写一些函数来决定a>b、abool{ //a是LE,因此反向并获取最大字节 设c=a.iter() .enumerate() .rev() .filter_map(|(i,b)|(如果*b!=0{返回一些((i,*b))

假设值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
}
fn更大(a:&[u8],b:usize)->bool{
//a是LE,因此反向并获取最大字节
设c=a.iter()
.enumerate()
.rev()
.filter_map(|(i,b)|(如果*b!=0{返回一些((i,*b))}其他{None}))
收集::();
对于c中的(i,be){
设k=(b>>(i*8))&255;
println!(“{},{}”,be,k);
返回为usize>k
}
假的
}
编辑:应该已经澄清,字节数组可以是任何整数、无符号整数或浮点。简单地说,任何整数bincode::serialize都可以序列化


我还想避免转换字节数组,比较应该在100000个字节数组上使用,所以我认为位操作是首选方法。

不需要所有这些额外步骤。基本问题是知道字节数组中编码的整数是
小尾端
大尾端
还是
本机尾端
。知道了这一点,您可以使用将固定大小的数组转换为整数;使用从切片获取固定大小的数组

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)
}
fn大于(b:&[u8],v:usize)->结果{
使用std::convert::TryFrom;
Ok(usize::from_le_字节(::try_from(b)?)>v)
}

如果字节片小于8字节,此函数将返回错误,在这种情况下,无法构造
usize
;您还可以转换为
u32
甚至
u16
,将其向上转换为
usize
,然后进行比较。还请注意,这个示例使用了来自字节的
,假设字节片包含一个编码为
小尾端的整数,顺便说一句,这正是bincode在反序列化值时所做的,因此您可以调用
bincode::deserialize
。这看起来像是过早优化的情况。我怀疑你能做的任何事情都比简单地反序列化二进制代码和比较反序列化的整数要快。正确编写的反序列化速度非常快。